【问题标题】:I need to call a function from a third-party library from ASP.NET, but it must not be allowed to run asynchronously我需要从 ASP.NET 中调用第三方库中的函数,但不能允许它异步运行
【发布时间】:2018-03-20 17:44:16
【问题描述】:

情况是这样的:

  • 我使用第三方库进行一些 SPF 检查
  • 检查是从 ASP.NET 网站完成的
  • 第三方库使用了大量的“等待/异步”代码,虽然我调用的是非异步方法来完成它
  • 大多数情况下,w3wp(是的,实际的 w3wp.exe)只是崩溃并出现以下错误“用于模拟的令牌无效 - 无法复制”。

我假设这是因为等待/异步从线程池中抓取了一个线程,该线程具有某种非法/奇怪的身份,所以我想知道是否有任何方法可以调用一些代码并告诉 .Net '忘记' async/await 并在同一个线程上同步运行它。

【问题讨论】:

  • 您可以创建一个自定义同步上下文,但这只有在 库没有通过调用 ConfigureAwait(false) 故意避免当前同步上下文时才有效。不幸的是,确实如此往往是推荐的编写库的方式。
  • 当问题是如此特定于库和使用时,只有供应商可以为您提供指导(或确认它可以与 ASP.NET 一起使用)。我怀疑这个库根本不是为 ASP.NET 上下文设计的(因为它似乎需要某些模拟设置)。
  • @Damien_The_Unbeliever 似乎该库在源代码中的任何位置都没有包含 ConfigureAwait,因此我将探讨自定义同步上下文的可能性。谢谢你的提示!

标签: asp.net .net asynchronous async-await


【解决方案1】:

我找到了一个解决方案:在产品的某个地方,用户被使用 identity.impersonate() 来模拟,但模拟上下文从未被 .undo()'d。在确保 identity.impersonate() 与 .undo() 正确匹配后,问题停止发生。

我确实尝试过制作自己的 SynchronizationContext,但在这种情况下这不起作用,因为传递模拟只是传递了“非法”模拟上下文。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-07
    • 2018-09-14
    • 2021-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多