异步等待.net 4.0 - 维护静态上下文

时间:2013-11-18 23:34:07

标签: asp.net-mvc-4 async-await c#-5.0

我有一个使用BCL async / await包的MVC 4.0站点。 为了在初始线程和后续线程(在await之后)保留HttpContext,我开始创建一个带有对上下文的引用的闭包,如下所示:

   public async Task<ViewResult> GetCustomer(int id)
      {            
       var ctx =  HttpContext.Current;
       ctx["test"] = "test";

       await DoSomeLongRunningIO();

       var test = ctx["test"];
       //do other things with context

       return View();
    }

但是,我需要在等待之后调用各种服务。这些遗留服务直接调用HttpContext.Current。 所以我使用以下代码来解决这个问题,这似乎是确保这些服务仍能按预期工作的简单方法。

  public async Task<ViewResult> GetCustomer(int id)
      {            
       var ctx =  HttpContext.Current;

       await DoSomeLongRunningIO();

       HttpContext.Current = ctx;

       //call other services which use static references to httpcontext
       return View();
    }

这确实有效,但我一直在阅读this answer that suggests it is a bad idea:

  1. 这是一个坏主意,如果是这样,为什么它比第一个例子更糟?
  2. 感谢您的时间。

1 个答案:

答案 0 :(得分:3)

您是否知道async/await in an ASP.NET app on .NET 4.0 is undefined

如果升级到.NET 4.5,您会发现自动保留HttpContext。没有必要关闭或设置它。

设置HttpContext.Current是一个坏主意,因为您绕过了ASP.NET安全检查,确保一次只有一个线程具有该上下文。