c# - HttpContext和TelemetryInitializer

标签 c# azure-application-insights

我想将用户的“client_id”声明作为属性附加到发送给Application Insights的每个请求中。

从我所读的内容中,我应该实现ITelemetryInitializer,但是我需要用于请求的HttpContext才能检索“client_id”。看到我的初始化器:

public class ClaimTelemetryInitializer : ITelemetryInitializer
{
    public HttpContext HttpContext { get; set; }

    public void Initialize(ITelemetry telemetry)
    {
        this.AddTelemetryContextPropertFromClaims(telemetry, "client_id");
    }

    private void AddTelemetryContextPropertFromClaims(ITelemetry telemetry, string claimName)
    {
        if (HttpContext != null)
        {
            var requestTelemetry = telemetry as RequestTelemetry;

            var claim = HttpContext.User.Claims.SingleOrDefault(x => x.Type.Equals(claimName, StringComparison.InvariantCultureIgnoreCase));

            if (claim != null)
            {
                telemetry.Context.Properties[claimName] = claim.Value;
            }
        }
    }
}

我可以创建一个 Action 过滤器来每次设置上下文,但这感觉很糟糕:
public class TrackClaimsAttribute : ActionFilterAttribute
{
    public override Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
    {
        var initialiser = TelemetryConfiguration.Active.TelemetryInitializers.OfType<ClaimTelemetryInitializer>().Single();

        initialiser.HttpContext = context.HttpContext;

        return base.OnActionExecutionAsync(context, next);
    }
}

有没有更好的方法来实现我想做的事?

最佳答案

您应该实现为您提供HttpContext的WebTelemetryInitializerBase

您的代码应如下所示:

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

            var claim = HttpContext.User.Claims.SingleOrDefault(x => x.Type.Equals(claimName, StringComparison.InvariantCultureIgnoreCase));

            if (claim != null)
            {
                telemetry.Context.Properties[claimName] = claim.Value;
            }
    }
}

关于c# - HttpContext和TelemetryInitializer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38413032/

相关文章:

c# - 操作返回无效状态代码 'BadRequest' - Microsoft.Azure.Management.ResourceGraph

azure - AzureFunctions 中的自定义 TelemetryInitializers

c# - 单元/集成测试和恢复数据库

c# - 为什么我不能在 out 参数中传递一个未分配的对象变量然后分配它

c# - 带溢出的简单区间/范围交集

c# - 将函数作为函数参数传递

c# - 针对部署到多个环境的 Web 应用程序的 VS Application Insights

azure - 为 Azure Function App (Terraform) 配置 Application Insights

azure-application-insights - 如何在不考虑依赖项持续时间的情况下评估 Application Insights 请求 "own"持续时间?

azure - TelemetryClient 在 Application Insights 中产生不一致的结果