You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过ITelemetryInitializer为Application Insights暴露HttpContext属性

.NET Framework 4.7.2 接入Application Insights获取RequestTelemetry解决方案

基础认知纠正

ITelemetryInitializer是Application Insights(以下简称AI)SDK内置的扩展点,不需要开发者主动调用Initialize()方法。SDK在生成任意遥测数据(请求、依赖、自定义事件等)时,会自动遍历所有已注册的ITelemetryInitializer实现,将待发送的遥测对象传入Initialize方法供开发者修改补充属性,主动调用该方法无法获取到当前请求的RequestTelemetry实例。

无HttpContext场景下获取RequestTelemetry方案

.NET Framework环境的AI SDK默认会将同一次请求的RequestTelemetry存储在CallContext中,只要代码属于当前请求的逻辑调用链,无需依赖HttpContext即可直接读取。

读取代码示例

// 优先从DI容器中解析TelemetryClient,不要重复新建实例
var telemetryClient = serviceProvider.GetRequiredService<TelemetryClient>();
var requestTelemetry = telemetryClient.Context.Operation.GetRequestTelemetry();

if (requestTelemetry != null)
{
    // 可直接读取请求属性,例如请求ID、路径、响应状态码等
    string requestPath = requestTelemetry.Url?.AbsolutePath;
    string operationId = requestTelemetry.Context.Operation.Id;
}

读取结果为Null的排查步骤

  • 检查执行时机:必须在AI SDK完成当前请求RequestTelemetry初始化之后调用,请求管道极早阶段(如Application_BeginRequest最开头)调用会返回Null
  • 检查异步/多线程场景:仅当调用线程携带当前请求的逻辑上下文时才能读取到值,手动通过Thread.Start、无上下文捕获的Task.Run开启的新线程无法读取,需手动传递RequestTelemetry实例
  • 检查AI模块注册:确认Web.config中已注册Microsoft.ApplicationInsights.Web.RequestTrackingTelemetryModule,该模块是生成RequestTelemetry并写入上下文的核心组件

DI注册适配(适配你当前的ServiceCollection服务定位器模式)

需确保Telemetry相关实例的生命周期正确,避免重复初始化导致上下文丢失:

// 注册全局TelemetryConfiguration,直接用SDK自动加载配置的Active实例即可,不要新建
services.AddSingleton<TelemetryConfiguration>(sp => TelemetryConfiguration.Active);
// 注册TelemetryClient,建议按请求范围或单例注册
services.AddScoped<TelemetryClient>(sp => new TelemetryClient(sp.GetRequiredService<TelemetryConfiguration>()));

如果确实需要统一修改所有遥测的属性,再自定义ITelemetryInitializer,注册方式如下:

// 自定义Initializer实现
public class CustomTelemetryInitializer : ITelemetryInitializer
{
    public void Initialize(ITelemetry telemetry)
    {
        if (telemetry is RequestTelemetry requestTelemetry)
        {
            requestTelemetry.Properties["CustomTag"] = "自定义属性值";
        }
    }
}

// DI注册 + 写入SDK配置
services.AddSingleton<ITelemetryInitializer, CustomTelemetryInitializer>();
TelemetryConfiguration.Active.TelemetryInitializers.Add(new CustomTelemetryInitializer());

内容的提问来源于stack exchange,提问作者Learn12

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 22:39:03