我正在构建一个 ASP.NET WebApi 2.1 应用程序,它需要相当于 HttpContext.Items 作为每个请求缓存。
即使在 IIS 托管下,我也无法使用 HttpContext,因为当我在服务/存储库层(HttpContext.Current 变为无效的)。
我正在使用 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() 创建的子容器。因此,我在并发负载下得到混合请求实例。
知道如何解决这个问题吗?我在网上搜索了两天,还没有找到任何真正的解决方案......
由于需要匹配某些接口,因此使用 TPL 调用,而不是 async/await
我建议你再看一下async
and await
。可以使用async
对于您的实施部分和让它与其他异步 API 互操作 http://msdn.microsoft.com/en-us/library/hh873178%28v=vs.110%29.aspx.
也就是说,如果你想保留HttpContext.Current
(还有文化等),那么关键是SynchronizationContext
。我有一个关于该类型的 MSDN 文章 http://msdn.microsoft.com/en-us/magazine/gg598924.aspx您可能会发现有帮助。由于您的代码使用 TPL,因此您可能希望将请求上下文捕获到任务调度程序中:
var requestContext = TaskScheduler.FromCurrentSynchronizationContext();
然后用它来安排你的任务继续。
ASP.NET 上的异步工作的另一个重要方面是确保运行时了解您的异步工作。您可以通过致电来做到这一点AsyncOperationManager.CreateOperation
在异步工作开始之前注册它并AsyncOperation.OperationCompleted
通知运行时异步工作已完成。或者,您可以捕获SynchronizationContext.Current
并打电话SynchronizationContext.OperationStarted
and SynchronizationContext.OperationCompleted
你自己。
再次,再看一下async
and await
看看是否有可能使用它们;他们会为您处理所有像这样的细节。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)