#.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.