WebApi 相当于具有依赖注入的 HttpContext.Items

2023-12-26

我正在构建一个 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(使用前将#替换为@)

WebApi 相当于具有依赖注入的 HttpContext.Items 的相关文章

随机推荐

  • 如何查找可能引发哪些异常

    我正在尝试找到最好的方法来找出我的 python 代码可能引发的异常 你们使用的最佳方法是什么 到目前为止我可以 祈祷是在某处的在线文档中这么说的 很少这样做 抓取 py 文件以获取 raise 语句 必须有更好的方法来获取这些信息 这个问
  • 全日历多个营业时间,每天两班制

    我已将完整日历集成到我的网站中 我的要求之一是从数据库中获取营业时间并将其呈现在日历上 所以基本上每天都有两班 早上和晚上 我需要能够创建一个营业时间数组 其中的值从数据库中填充 开箱即用 我可以使用下面的代码来呈现常见的营业时间 busi
  • 如何改进 euler 14 的代码?

    我解决了欧拉问题 14 http projecteuler net problem 14但我使用的程序非常慢 我看看其他人做了什么 他们都想出了优雅的解决方案 我试图理解他们的代码 但没有取得多大成功 这是我的代码 确定 Collat z
  • 在 Stream.read 中使用 Longint 计数和 Int64 大小不是很危险吗?

    我正在检查TMemoryStream http docwiki embarcadero com Libraries Tokyo en System Classes TMemoryStream LoadFromStream类并发现以下例程 p
  • OCaml 中短路运算符和 let 的求值顺序

    在 OCaml 中 当使用let为短路运算符分配别名 or 它不再短路操作数的求值 这并不直观 这种行为的原因是什么 考虑以下代码 let f Printf printf f false let g Printf printf g true
  • Ruby Activerecord IN 子句

    我想知道是否有人知道如何在 activerecord 中执行 IN 子句 不幸的是 IN 子句几乎无法通过谷歌搜索 所以我必须在这里发布 基本上我想回答这样的问题 给我这些宿舍中的所有大学生 其中宿舍id在此数组 id数组 中 我知道如何在
  • 使用opencv检测图像中的文本

    我需要检测图像中的文本 这里有一些在大多数情况下都有效的代码 但并非全部 请参阅附加的输入 输出图像 code include string include fstream include var bin opencv include op
  • 在运行时将 X 个带有 SelectedItem 的 ComboBox 添加到 DataGrid (WPF)

    我想创建一整行ComboBoxes in a DataGrid 我在以下方面取得了一些进展 Declare it private DataGridComboBoxColumn CreateCustomComboBoxDataSouce st
  • 如何在我的 swing 应用程序中使用 Java 类调用并向 Servlet 传递参数? [复制]

    这个问题在这里已经有答案了 在我的 Swing 应用程序中 我需要使用登录页面将参数传递给 servlet 来对用户进行身份验证 在 Web 应用程序中 我们可以使用 Ajax 和 JavaScript 来完成此操作 但是 如何在我的 Sw
  • Keras LSTM 层实现背后的架构是什么?

    Keras 中 LSTM 层的输入维度如何转换为输出维度 从阅读可拉的博客文章 http colah github io posts 2015 08 Understanding LSTMs 看起来好像有 timesteps 又名input
  • Heroku Web 服务器无法在本地启动

    我在本地启动 heroku Web 服务器时遇到问题 这是我不断收到的错误消息 PS C Users Dragan heroku workspace python getting started gt heroku local OKAY L
  • 如何设置从 UIDatePicker 检索的日期格式

    我正在从 UIDatePicker 检索日期 现在我想转换为周三 12 月 29 日下午 12 30 格式 我还想将该日期设置为 UIPickerView 的当前显示日期 您可以使用此代码 它正是您想要的 NSDateFormatter d
  • GCC 要求此引用声明使用 constexpr 说明符是否正确?

    下面的代码不能编译海湾合作委员会5 3 0 https goo gl 2oyoCt因为声明r缺少一个constexpr说明符 const int i 1 const int r i constexpr int j r 我相信拒绝是正确的 如
  • Xamarin (XAML) 如何并排放置 2 个标签

    我有 2 个标签需要使用不同的字体来制作单个标签 我的公司 c 文案符号 我的公司 将采用大字体 而 c 将采用小字体 我无法让它们显示为 1 个单一标签 似乎存在间距问题 我已经尝试过以下方法
  • 如何解决Vue 3自定义渲染器错误

    我正在尝试使用 Vue 3 和 Vite 构建自定义渲染器 渲染器正在其工作原始仓库 https github com SaFrMo vite minimum renderer 克隆该存储库 npm install and npm run
  • 什么是“逻辑CPU核心”

    我正在阅读一些操作系统材料 我读到这句话让我有点困惑 多核是指具有多个逻辑 CPU 核心 并且可以同时执行多条指令的计算机或处理器 什么是 逻辑CPU核心 是处理器吗 它是否对应于物理的东西 或者是操作系统看到逻辑CPU核心 但实际上物理处
  • 新建的 KTable 不返回任何内容

    我正在尝试使用 KTable 来消费来自 Kafka 主题的事件 但是 它什么也没返回 当我使用 KStream 时 它返回并打印对象 这实在是太奇怪了 生产者和消费者可以在这里找到 https github com pavankjadda
  • Android 测试未执行

    我创建了一个测试项目 其代码与此处所示完全相同 http developer android com tools testing testing ui html http developer android com tools testin
  • 如何在 Firefox 插件中使用 Javascript 将图像上传到 ImgBB API

    有关 API 的信息可以找到here https api imgbb com 它没有提供任何与 Javascript 一起使用的详细信息 仅提供与curl 一起使用的详细信息 已经尝试了这里旧帖子中的许多不同方法 但这是迄今为止我得到的最接
  • WebApi 相当于具有依赖注入的 HttpContext.Items

    我正在构建一个 ASP NET WebApi 2 1 应用程序 它需要相当于 HttpContext Items 作为每个请求缓存 即使在 IIS 托管下 我也无法使用 HttpContext 因为当我在服务 存储库层 HttpContex