【问题标题】:Where is Application Insights injecting HttpContext into IHttpContextAccessor.Request?Application Insights 在哪里将 HttpContext 注入 IHttpContextAccessor.Request?
【发布时间】:2019-04-23 00:56:04
【问题描述】:

我发现自己处于一个有趣的位置。我目前使用最新的 Unity 容器,我在 asp.net core 2.2 上,我使用应用程序洞察力。因此,我已在我的 Web 应用程序中配置 DI 以使用统一而不是核心中的开箱即用 DI 提供程序。我还使用 Application Insights 并使用 IWebHostBuilder.UseApplicationInsights 扩展来为我的应用启动 AI。

考虑到这一切,我有一段代码,其构造函数接受 IHttpContextAccessor,因此我可以访问 HttpContext。它工作得很好。然后,我有另一个小应用程序,我试图重用该功能,而来自 IHttpContextAccessor 的 HttpContext 为空。通过一堆猜测、测试、修改,我发现 IWebHostBuilder.UseApplicationInsights 似乎在 IHttpContextAccessor 上初始化了请求属性(HttpContext)。如果我注释掉那个 AI 扩展,我会得到 null;取消注释,它起作用了。

我已经开始查看 AI 代码以弄清楚它们到底在做什么,但老实说,有所有依赖项和管道以及所有这些,这是一项非常艰巨的任务。我希望有人能指出人工智能在哪里/如何做到这一点,这样我的代码就不需要人工智能来工作。所有的帮助都会非常棒。

【问题讨论】:

  • 只需在启动时自己添加访问器mappnig IHttpContextAccessor to HttpContextAccessor
  • 是的,我这样做了

标签: azure asp.net-core unity-container azure-application-insights


【解决方案1】:

使用 AddHttpContextAccessor 扩展将其添加到 DI。由于性能影响,默认不添加HttpContextAccessor。

services.AddHttpContextAccessor();

【讨论】:

    【解决方案2】:

    经过一番挣扎,希望这篇文章能对我的 AI 问题有所启发,我发现我不需要复制 AI 机制,如果有的话。

    最初,我通过视图(Razor)中的代码访问 IHttpContextAccessor。我有一个抽象工厂模式,用于通过 Unity 实例化 IHttpContextAccessor(这种模式来自我的 .Net Frame 工作日)。一旦我将该代码移回控制器并使用正确的 .net core DI 通过构造函数获取依赖项,一切都开始工作了。

    那里一定有我遗漏的东西,但我的代码可以正常工作,所以我很高兴。如果有人能阐明为什么一种方式与另一种方式有效,我很乐意听到。

    【讨论】:

      【解决方案3】:

      当您通过调用 .UseApplicationInsights() 启用应用程序洞察时,它会添加 HttpContextAccessor。 ApplicationInsights 中有许多组件需要注入 HttpContextAccessor。例如:ClientIpHeaderTelemetryInitializer。

      这是发生这种情况的确切行: https://github.com/Microsoft/ApplicationInsights-aspnetcore/blob/develop/src/Microsoft.ApplicationInsights.AspNetCore/Extensions/ApplicationInsightsExtensions.cs#L137

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-18
        • 2018-04-24
        • 2019-07-14
        • 2016-05-05
        • 1970-01-01
        • 1970-01-01
        • 2020-02-02
        • 2021-02-20
        相关资源
        最近更新 更多