我需要从 ASP.NET 中调用第三方库中的函数,但不能允许它异步运行

Posted

技术标签:

【中文标题】我需要从 ASP.NET 中调用第三方库中的函数,但不能允许它异步运行【英文标题】:I need to call a function from a third-party library from ASP.NET, but it must not be allowed to run asynchronously 【发布时间】: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,因此我将探讨自定义同步上下文的可能性。谢谢你的提示! 【参考方案1】:

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

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

【讨论】:

以上是关于我需要从 ASP.NET 中调用第三方库中的函数,但不能允许它异步运行的主要内容,如果未能解决你的问题,请参考以下文章

从 ASP.NET 将网页转换为图像

如何从asp.net中的js函数调用c#函数?

从 ASP.NET Core Blazor 中的 .NET 方法调用 JavaScript 函数

asp.net MVC - 我可以从类库中引用视图吗?

从asp.net mvc中的switch case调用javascript函数

从汇编代码调用库中的 C 函数