为什么等待后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应该在等待后解决。关于这个问题,甚至还有另一条评论表明了这一点。那是真的吗?它应该解决吗?我认为没有,但是我想要一个权威的答案,因为asyncawait足够新,所以我找不到任何确定的答案。

TL; DR:HttpContext.Current可能nullawait

回答:

请确保您正在编写ASP.NET 4.5 应用程序并以4.5为目标。async并且await有除非你是在4.5上运行ASP.NET未定义行为

,并 使用新的“任务型”同步上下文。

特别是,这意味着您必须:

  • 设置httpRuntime.targetFramework4.5,或
  • 在中appSettings,设置aspnet:UseTaskFriendlySynchronizationContexttrue

可在此处获得更多信息。

以上是 为什么等待后HttpContext.Current为null? 的全部内容, 来源链接: utcz.com/qa/402932.html

回到顶部