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

迁移至.NET 6后Application Insights自定义初始化器部署失效问题

.NET 6中修复Windows服务的Application Insights日志上报问题(替换过时的TelemetryConfiguration.Active)

问题根源

.NET 6中TelemetryConfiguration.Active已被标记为过时,且在Windows服务这类非交互式环境中无法正常初始化配置,导致日志无法上报至Application Insights。以下是针对性的代码修改方案:

核心修改思路

  • 废弃静态TelemetryConfiguration.Active,改为显式创建/管理TelemetryConfiguration实例
  • 替换过时的System.Configuration.ConfigurationManager,改用.NET 6原生IConfiguration读取配置
  • 确保配置在Windows服务启动阶段完成初始化,保证全局可用性

1. 重构Application Insights初始化方法

using Microsoft.ApplicationInsights.Extensibility;
using Microsoft.Extensions.Configuration;
using System.IO;

public static TelemetryConfiguration InitializeApplicationInsights(IConfiguration configuration)
{
    if (!File.Exists("ApplicationInsights.config"))
    {
        return TelemetryConfiguration.CreateDefault();
    }

    var xml = File.ReadAllText("ApplicationInsights.config");
    var telemetryConfig = TelemetryConfiguration.CreateFromConfiguration(xml);

    // 读取配置参数(适配.NET 6配置系统)
    string parameter = configuration["ApplicationInsightsParameter"];

    // 添加自定义初始化器
    telemetryConfig.TelemetryInitializers.Add(new JobsTelemetryInitializer(parameter));

    // 可选:设置全局默认配置,兼容旧代码调用逻辑
    TelemetryConfiguration.Default = telemetryConfig;

    return telemetryConfig;
}

2. 修正自定义Telemetry初始化器

原代码存在变量引用错误,同时优化版本号读取逻辑:

using Microsoft.ApplicationInsights.Channel;
using Microsoft.ApplicationInsights.Extensibility;
using System.Reflection;

public class JobsTelemetryInitializer : ITelemetryInitializer
{
    public string Parameter { get; }

    public JobsTelemetryInitializer(string parameter)
    {
        Parameter = parameter;
    }

    public void Initialize(ITelemetry telemetry)
    {
        var context = telemetry.Context;

        context.Cloud.RoleName = "Jobs";
        context.Component.Version = Assembly.GetExecutingAssembly().GetName().Version?.ToString() ?? "Unknown";

        if (telemetry is ISupportProperties supported)
        {
            supported.Properties["Parameter"] = Parameter; // 修正为类属性引用
            supported.Properties["Product"] = "Blabla";
        }
    }
}

3. 在Windows服务启动时完成配置初始化

在Program.cs的服务启动逻辑中集成配置初始化:

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

Host.CreateDefaultBuilder(args)
    .UseWindowsService() // 标记为Windows服务
    .ConfigureServices((hostContext, services) =>
    {
        // 初始化Application Insights配置
        var telemetryConfig = InitializeApplicationInsights(hostContext.Configuration);
        
        // 将配置注册为单例,供服务类注入使用
        services.AddSingleton(telemetryConfig);
        
        // 可选:集成日志框架的Application Insights支持
        services.AddApplicationInsightsTelemetry();
        
        // 注册你的Windows服务实现类
        services.AddHostedService<YourWindowsServiceImplementation>();
    })
    .Build()
    .Run();

关键说明

  • 废弃TelemetryConfiguration.Active:改用TelemetryConfiguration.CreateFromConfiguration创建实例,或通过TelemetryConfiguration.Default设置全局默认,避免静态实例在服务环境中的初始化问题
  • 配置系统适配:使用.NET 6原生IConfiguration读取配置,确保Windows服务环境下能正确加载appsettings.json或自定义配置文件
  • Windows服务标记:UseWindowsService()确保应用以Windows服务模式运行时,初始化逻辑能在服务启动阶段执行,而非仅在调试环境生效

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 23:04:58