为什么等待后HttpContext.Current为null?
我有以下测试WebAPI代码,我不在生产中使用WebAPI,但由于进行了有关此问题的讨论,所以进行了此操作:WebAPI异步问题
无论如何,这是令人讨厌的WebAPI方法:
public async Task<string> Get(int id){
var x = HttpContext.Current;
if (x == null)
{
// not thrown
throw new ArgumentException("HttpContext.Current is null");
}
await Task.Run(() => { Task.Delay(500); id = 3; });
x = HttpContext.Current;
if (x == null)
{
// thrown
throw new ArgumentException("HttpContext.Current is null");
}
return "value";
}
至此,我相信第二个例外是可以预期的,因为await
完成后,它很可能位于另一个线程上,HttpContext.Current
而线程静态变量将不再解析为适当的值。现在,基于同步上下文,实际上它可能被迫在等待后返回到同一线程,但是我在测试中没有做任何花哨的事情。这只是的简单,幼稚的用法await
。
在另一个问题的评论中,我被告知HttpContext.Current
应该在等待后解决。关于这个问题,甚至还有另一条评论表明了这一点。那是真的吗?它应该解决吗?我认为没有,但是我想要一个权威的答案,因为async
和await
足够新,所以我找不到任何确定的答案。
TL; DR:HttpContext.Current
可能null
在await
?
回答:
请确保您正在编写ASP.NET 4.5 应用程序并以4.5为目标。async
并且await
有除非你是在4.5上运行ASP.NET未定义行为
,并 使用新的“任务型”同步上下文。
特别是,这意味着您必须:
- 设置
httpRuntime.targetFramework
为4.5
,或 - 在中
appSettings
,设置aspnet:UseTaskFriendlySynchronizationContext
为true
。
可在此处获得更多信息。
以上是 为什么等待后HttpContext.Current为null? 的全部内容, 来源链接: utcz.com/qa/402932.html