我正在构建一个ASP.NET WebApi 2.1应用程序,需要一个类似于HttpContext.Items的每个请求缓存。
即使在IIS托管下,由于在服务/存储库层中执行异步工作(使用TPL调用而不是async/await以匹配某些接口),HttpContext似乎也会丢失(HttpContext.Current变为null),因此我不能使用HttpContext。
我正在使用Unity 3.5,并且无法实现适当的每个请求注入。尝试了HttpControllerActivator方法:
但是这注册了HttpRequestMessage到根容器上,而不是在_activator.Create内部的BeginScope()调用创建的子容器上。因此,在并发负载下,我会得到混合的请求实例。
有没有什么办法解决这个问题?我已经在线搜索了两天,还没有找到任何真正解决这个问题的方法...
即使在IIS托管下,由于在服务/存储库层中执行异步工作(使用TPL调用而不是async/await以匹配某些接口),HttpContext似乎也会丢失(HttpContext.Current变为null),因此我不能使用HttpContext。
我正在使用Unity 3.5,并且无法实现适当的每个请求注入。尝试了HttpControllerActivator方法:
public class HttpControllerActivator : IHttpControllerActivator
{
private readonly IUnityContainer _container;
private readonly IHttpControllerActivator _activator;
public HttpControllerActivator(IUnityContainer container, IHttpControllerActivator activator)
{
_container = container;
_activator = activator;
}
public IHttpController Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)
{
IHttpController controller = _activator.Create(request, controllerDescriptor, controllerType);
_container.RegisterInstance<System.Net.Http.HttpRequestMessage>(request, new HierarchicalLifetimeManager());
return controller;
}
}
但是这注册了HttpRequestMessage到根容器上,而不是在_activator.Create内部的BeginScope()调用创建的子容器上。因此,在并发负载下,我会得到混合的请求实例。
有没有什么办法解决这个问题?我已经在线搜索了两天,还没有找到任何真正解决这个问题的方法...
TaskScheduler.FromCurrentSynchronizationContext()
后,我就不再进入继续任务了。此外,我并不是真正喜欢在各个地方都使用那个旧的AsymcOperationManager。所有这一切都让我相信async
和await
是正确的选择,尽管我真的不喜欢必须用Task结果声明我的接口这一事实! - blemasleTask
有点讨厌,非常类似于IDisposable
:你必须猜测任何派生类型是否可能是异步的(或者具有需要处理的资源)。 - Stephen ClearyTaskScheduler
,但每当我使用它时,我的调用就会永远挂起(我怀疑asp.net没有“看到”任务已经结束)。有什么想法吗? - blemasleasync
,那么您就不会遇到HttpContext
或死锁问题。 - Stephen Cleary