一尘不染

为什么等待后HttpContext.Current为null?

c#

我有以下测试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


阅读 387

收藏
2020-05-19

共1个答案

一尘不染

请确保您正在编写ASP.NET 4.5 应用程序并以4.5为目标。async并且await有除非你是在4.5上运行ASP.NET未定义行为
,并 使用新的“任务型”同步上下文。

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

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

可在此处获得更多信息。

2020-05-19