我有一个使用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:
感谢您的时间。
答案 0 :(得分:3)
您是否知道async
/await
in an ASP.NET app on .NET 4.0 is undefined?
如果升级到.NET 4.5,您会发现自动保留HttpContext
。没有必要关闭或设置它。
设置HttpContext.Current
是一个坏主意,因为您绕过了ASP.NET安全检查,确保一次只有一个线程具有该上下文。