如何使用 ITelemetryInitializer 为 ApplicationInsights 公开 HttpContext

How do I expose HttpContext using ITelemetryInitializer for ApplicationInsights

我正在尝试为使用 VS 2015 和 .NET Framework 4.7.2 的旧应用程序实施 App Insights。

我有一个服务定位器 class,它构建一个 ServiceCollection 对象,然后将解析那些 classes。在我需要解析服务的地方,我没有访问 HttpContext 对象的权限。

我了解到您可以使用 ITelemetryInitializer 接口访问 AI RequestTelemetry 对象,该对象拥有许多与 HttpContext 相同的属性。问题是,当它到达代码中的那个点时,值为 NULL。

我不明白的是我应该如何调用 Initialize() 方法来查看 RequestTelemetry?我是否向它传递另一个继承 ITelemetryInitializer 的 class 类型?我可能没有正确理解 DI。

感谢帮助!

What I don't understand is how am I supposed to call that Initialize() method to see the RequestTelemetry? Do I pass it another class type that inherits ITelemetryInitializer?

除了将初始化程序添加到服务集合之外,您无需执行任何操作。然后,App Insights 将执行所有已注册初始化程序的 Initialize 或 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";

在控制器中。