Application Insights TelemetryInitializer 和 HttpContext.User

Application Insights TelemetryInitializer and HttpContext.User

在 WebApi2 项目中,我有自定义声明,我想为每个请求将其作为自定义 属性 发送。

我实现了 TelemetryInitializer,但 HttpContext 中的 User 始终为 null。

public class MyTelemetryInitializer : ITelemetryInitializer
{   
    var requestTelemetry = telemetry as RequestTelemetry;
    if (requestTelemetry == null) return;

    var user= HttpContext.Current.User;

    // values from header are wokring
     requestTelemetry.Context.Properties["abc"] = HttpContext.Current.Request.Headers.Get("abc");

}

实现此目标的正确方法是什么?

根据你的描述,我检查了Visual Studio Application Insights SDK for .NET Web Applications and found WebTelemetryInitializerBase.cs有一个抽象方法OnInitializeTelemetry如下:

protected abstract void OnInitializeTelemetry(
            HttpContext platformContext,
            RequestTelemetry requestTelemetry, 
            ITelemetry telemetry);

您可以继承 WebTelemetryInitializerBase 并覆盖提供 HttpContext 参数的 OnInitializeTelemetry 方法,然后您可以检索您的声明。

更新:

您还可以继承其他继承 WebTelemetryInitializerBase.

的 TelemetryInitializers

例如,UserTelemetryInitializer,您可以按如下方式定义自定义 TelemetryInitializer:

public class CustomTelemetryInitializer : UserTelemetryInitializer  //WebTelemetryInitializerBase
{
    protected override void OnInitializeTelemetry(
            HttpContext platformContext,
            RequestTelemetry rootRequestTelemetry,
            ITelemetry telemetry)
    {

        var claim = ((ClaimsIdentity)platformContext.User.Identity).Claims.FirstOrDefault(x => x.Type.Equals("<custom-claim-name>", StringComparison.InvariantCultureIgnoreCase)); ;

        if (claim != null)
        {
            telemetry.Context.Properties["<<custom-claim-name>>"] = claim.Value;
        }
    }
}

此外,您还可以通过here搜索其他TelemetryInitializers。