gpt4 book ai didi

asp.net-web-api - 具有依赖注入(inject)的 HttpContext.Items 的 WebApi 等效项

转载 作者:行者123 更新时间:2023-12-03 20:20:28 24 4
gpt4 key购买 nike

我正在构建一个 ASP.NET WebApi 2.1 应用程序,它需要一个等效的 HttpContext.Items 作为每个请求的缓存。

即使在 IIS 托管下,我也无法使用 HttpContext,因为当我在服务/存储库层(HttpContext.Current 变为空值)。

我正在使用统一 3.5 并且无法实现正确的每个请求注入(inject)。尝试了 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() 调用创建的子容器。结果,我在并发负载下得到了混合请求实例。

知道如何解决这个问题吗?我在网上搜索了两天,还没有找到任何真正的解决方案......

最佳答案

using TPL calls, not async/await due to some interface that needs to be matched



我建议你再看看 asyncawait .可以使用 async对于您的实现部分和 have it interoperate with other asynchronous APIs .

也就是说,如果您想保留 HttpContext.Current (还有文化等),那么关键是 SynchronizationContext .我有一个 MSDN article on that type你可能会觉得有帮助。由于您的代码使用 TPL,您可能希望将请求上下文捕获到任务调度程序中:
var requestContext = TaskScheduler.FromCurrentSynchronizationContext();

然后使用它来安排您的任务继续。

ASP.NET 上异步工作的另一个重要方面是确保运行时知道您的异步工作。您可以调用 AsyncOperationManager.CreateOperation在异步工作开始之前注册它和 AsyncOperation.OperationCompleted通知运行时异步工作已完成。或者,您可以捕获 SynchronizationContext.Current并调用 SynchronizationContext.OperationStartedSynchronizationContext.OperationCompleted你自己。

再看一次 asyncawait看看是否可以使用它们;他们会为你处理所有像这样的坚韧不拔的细节。

关于asp.net-web-api - 具有依赖注入(inject)的 HttpContext.Items 的 WebApi 等效项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23395632/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com