Как я могу предоставить HttpContext с помощью ITelemetryInitializer для ApplicationInsights

#.net #azure #interface #azure-application-insights

Вопрос:

Я пытаюсь реализовать App Insights для более старого приложения, используя VS 2015 и .NET Framework 4.7.2.

У меня есть класс service locator, который создает объект ServiceCollection, а затем разрешает эти классы в дальнейшем. Там, где мне нужно разрешить службу, у меня нет доступа к объекту HttpContext.

введите описание изображения здесь

Я читал, что вы можете получить доступ к объекту AI RequestTelemetry, который содержит многие из тех же свойств, что и HttpContext, используя интерфейс ITelemetryInitializer. Проблема в том, что когда он достигает этой точки кода, значение равно НУЛЮ.

введите описание изображения здесь

Чего я не понимаю, так это как я должен вызвать этот метод Initialize (), чтобы увидеть RequestTelemetry? Должен ли я передать ему другой тип класса, который наследует ITelemetryInitializer? Возможно, я неправильно понял идею ДИ.

Спасибо за помощь!

Комментарии:

1. Пожалуйста, не прикрепляйте скриншоты кода, а вставьте сам код!

Ответ №1:

Чего я не понимаю, так это как я должен вызвать этот метод Initialize (), чтобы увидеть RequestTelemetry? Должен ли я передать ему другой тип класса, который наследует ITelemetryInitializer?

Вам не нужно ничего делать, кроме добавления инициализатора в коллекцию служб. Затем App Insights выполнит методы инициализации или OnInitializeTelemetry всех зарегистрированных инициализаторов.

Затем, что касается кодекса:

Во-первых, не вся телеметрия, проходящая через инициализатор, будет иметь тип RequestTelemetry . Вместо этого вам следует сделать что-то вроде:

 public class CustomInitializer : ITelemetryInitializer
{
    public void Initialize(ITelemetry telemetry)
    {
        if(telemetry is RequestTelemetry requestTelemetry)
        {
            ...
        }
    }
}

 

В вашем коде requestTelemetry будет null , когда речь идет о любом другом типе телеметрии DependencyTelemetry , например.

Тем не менее, если вы просто хотите добавить некоторые свойства в / прочитать свойства из определенного запроса, вы можете это сделать

 var rt = System.Web.HttpContext.Current.GetRequestTelemetry();
rt.Properties["key"] = "value";
 

в контроллере.

Комментарии:

1. Питер, я ценю твой ответ. Я попробую это сделать и посмотрю, что произойдет. Я работаю в VS 2015, к сожалению, из-за SilverLight.