Application Insights TelemetryInitializer 和 HttpContext.User

Cha*_*bub 0 asp.net-web-api2 azure-application-insights

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

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

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");

}
Run Code Online (Sandbox Code Playgroud)

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

Bru*_*hen 5

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

protected abstract void OnInitializeTelemetry(
            HttpContext platformContext,
            RequestTelemetry requestTelemetry, 
            ITelemetry telemetry);
Run Code Online (Sandbox Code Playgroud)

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

更新:

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

例如,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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

此外,您还可以通过此处搜索其他 TelemetryInitializer 。