我遇到了 this question 中描述的相同问题,我在异步操作后丢失了 HttpContext.Current
。这个问题和我的问题之间的主要区别在于,我已经应用了所有可能的解决方案来解决它 - 所有这些都可以在我的 PC 上运行 但当我们部署到网络服务器时却不起作用已安装 .NET 4.8。另一件要注意的事情是,当我们应用设置时 - 我们可以看到 SynchronizationContext
的类型是 AspNetSynchronizationContext
(而不是 Legacy,所以我们似乎拥有了我们想要的东西)。
我们检查了 IIS 应用程序设置并确保没有手动添加或否定设置(例如 <add key="aspnet:UseTaskFriendlySynchronizationContext" value="false" />
或类似内容),但没有。我们还尝试了 <httpRuntime targetFramework="4.5" />
- 但没有奏效。
是否有任何其他设置/配置/可能的 .NET CLR 解释可以进行此设置:<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
在执行异步操作时不将 HttpContext.Current 传递给线程?
另外 - 如果我有 <httpRuntime targetFramework="4.5" />
- 并且我看到 LegacyAspNetSynchronizationContext
- 根本原因可能是什么?
示例(本地)有效,但在网络服务器上中断:
[HttpGet]
[Route("api/DelayTest")]
public async Task<int> Test()
{
var ctx = System.Web.HttpContext.Current; // not null
await Task.Delay(new TimeSpan(0, 0, 5));
ctx = HttpContext.Current; //null here (which causes issues)
return 0;
}
注意:我们的目标是 .NET 4.5:
<compilation debug="true" targetFramework="4.5" />
<httpRuntime targetFramework="4.5" maxQueryStringLength="6000" />