在ASP.NET 4.8中等待之后,HttpContext为null



我试图在asp.net 4.8中编写异步代码,但问题是从等待返回后HttpContext为null。这意味着异步代码可以正常工作,这很好,但原始代码需要HttpContext。从Darin Dimitrov在下面的回答中的评论中可以看出,HttpContext自4.6.1以来就存在这个问题。为什么等待后HttpContext.Current为null?

var domains = HttpContext.Current.Cache.Get("domains") as Dictionary<String, Domains>;

if (domains == null)
{
var x = await TrackingMethods.GetTableForCacheAsync().ConfigureAwait(false);
domains = x.domains;
}
/// HttpContext.Current is null here

ConfigureAwait(false)的意思是"不要在捕获的上下文上继续"。通过指定ConfigureAwait(false),代码告诉运行时它不需要ASP.NET请求上下文。但是您的代码确实需要ASP.NET请求上下文,因为它依赖于HttpContext.Current。所以在这里使用ConfigureAwait(false)是错误的。

如果我不使用ConfigureAwait(false(,代码将不会运行。

这可能是因为您的代码正在阻塞调用堆栈的更上层,从而导致死锁。理想的解决方案是移除阻塞,即始终使用async。一直使用CCD_ 6比用CCD_。

然而,在少数情况下,这是不可能的。例如,ASP.NET 4.8对MVC操作筛选器或子操作没有适当的异步支持。如果你正在做这样的事情,那么你有几个选择:

  • 使其始终同步,而不是始终异步
  • 使用-ConfigureAwait(false)反模式保持异步阻塞,但首先从HttpContext.Current中复制出代码所需的所有内容,并将数据作为显式参数传递,这样代码就不再依赖于ASP.NET请求上下文

相关内容

最新更新