【发布时间】:2013-08-29 20:59:39
【问题描述】:
考虑以下 ASP.NET Web API 委托处理程序:
public class MyHandler : DelegatingHandler
{
protected async override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
{
var guid = Guid.NewGuid();
HttpContext.Current.Items["foo"] = guid;
// An Async operation
var result = await base.SendAsync(request, cancellationToken);
//All code from this point is not gauranteed to run on the same thread that started the handler
var restoredGuid = (Guid)HttpContext.Current.Items["foo"];
//Is this gauranteed to be true
var areTheSame = guid == restoredGuid;
return result;
}
}
上面的例子是在一个委托处理程序中,我试图解决的同样的问题也适用于控制器、业务对象等。
我最终试图在每个 HTTP 请求的各种对象之间提供一些简单的内存共享状态
据我了解,在异步操作期间,最初运行该操作的 ASP.NET 线程将返回到线程池,并且可以在异步操作完成后使用不同的线程来完成请求。
这会影响HttpContext.Current.Items 集合吗?
当请求恢复时,Items 集合中的项目是否保证存在?
我知道使用
HttpContext.Current经常被 由于我完全同意的原因,这些天来更广泛的社区 与...我只是在帮助某人摆脱困境。将此数据存储在
Request.Items集合中不适合解决此问题,因为我的同事由于一些糟糕的设计决策需要静态。
非常感谢
【问题讨论】:
-
嗨,杰森,这些问题;虽然相似;不完全一样。不过还是谢谢。
-
啊,好吧 :) 不用担心。
-
HttpContext将被保留,但延续线程可能不一样。 AspNetSynchronizationContext 将管理上下文。
标签: c# asp.net asp.net-web-api .net-4.5 async-await