请考虑以下 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
集合中不适合解决此问题,因为我的同事由于一些糟糕的设计决策而需要静态。
非常感谢