Где Application Insights внедряет HttpContext в IHttpContextAccessor.Request? - PullRequest
0 голосов
/ 23 апреля 2019

Я оказался в интересной ситуации.Я в настоящее время использую последний контейнер Unity, я нахожусь на ядре asp.net 2.2, и я использую понимание приложения.Таким образом, я настроил DI в своем веб-приложении для использования единства вместо стандартного поставщика DI в ядре.Я также использую Application Insights и использую расширение IWebHostBuilder.UseApplicationInsights для ускорения AI для моего приложения.

Имея все это в виду, у меня есть фрагмент кода, конструктор которого принимает IHttpContextAccessor, чтобы я мог получить доступ к HttpContext.Это работало отлично.Затем у меня было другое маленькое приложение, которое я пытался повторно использовать функциональность, и HttpContext был нулевым от IHttpContextAccessor.С кучей догадок, тестов, ревизий я обнаружил, что IWebHostBuilder.UseApplicationInsights, похоже, инициализирует это свойство запроса (HttpContext) в IHttpContextAccessor.Если бы я закомментировал это расширение AI, я бы получил null;раскомментируйте это, это сработало.

Я начал просматривать код AI, чтобы выяснить, что именно они делают, но, честно говоря, со всеми зависимостями и конвейерами и всем этим, это довольно сложная задача,Я надеялся, что кто-то может указать, где и как ИИ делает это, поэтому мой код НЕ НУЖЕН ИИ для работы.Вся помощь была бы невероятно удивительной.

Ответы [ 3 ]

0 голосов
/ 23 апреля 2019

После некоторой борьбы и, надеясь, что этот пост просветит меня в вопросе об искусственном интеллекте, я обнаружил, что мне не нужно копировать механизм искусственного интеллекта, если он вообще есть.

Первоначально я обращался к IHttpContextAccessor через код в представлении (Razor). У меня есть абстрактный шаблон фабрики, который я использовал для создания экземпляра IHttpContextAccessor через Unity (этот шаблон пришел из моих дней работы .Net Frame). Как только я переместил этот код обратно в контроллер и использовал надлежащий DI ядра .net для получения зависимости через конструктор, все стало работать.

Там должно быть что-то, чего мне не хватает, но у меня работает код, так что я счастлив. Если бы кто-то мог пролить свет на то, почему один путь работает против другого, я был бы рад это услышать.

0 голосов
/ 25 апреля 2019

Когда вы включаете понимание приложения, вызывая .UseApplicationInsights (), он добавляет HttpContextAccessor.В ApplicationInsights есть много компонентов, для которых требуется HttpContextAccessor.Например: ClientIpHeaderTelemetryInitializer.

Это точная строка, где это происходит: https://github.com/Microsoft/ApplicationInsights-aspnetcore/blob/develop/src/Microsoft.ApplicationInsights.AspNetCore/Extensions/ApplicationInsightsExtensions.cs#L137

0 голосов
/ 23 апреля 2019

Используйте расширение AddHttpContextAccessor, чтобы добавить его в DI.HttpContextAccessor не добавляется по умолчанию из-за снижения производительности.

services.AddHttpContextAccessor();
...