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

.NET Core 2 ASP.NET应用中Rogue CurlException异常日志问题咨询

解答:处理.NET Core 2中AppInsights上报的CurlException问题

这是不是System.Net.Http的bug?

首先,这不太算是System.Net.Http的bug。你的场景里,代码已经正确将这个CurlException转化为了有效的Http响应消息,说明HttpClient本身已经处理了底层的异常情况。问题出在Application Insights(AI)的依赖追踪模块上——它监听了更低层级的异常事件,即便你的代码已经处理了这个异常,AI还是把它当成了一个失败的依赖调用上报了。

简单来说:System.Net.Http的行为是符合预期的(处理异常并返回响应),但AI的依赖追踪逻辑在这里过度捕捉了底层异常,导致日志被干扰。

如何在不禁用全部依赖追踪的前提下禁用该异常日志?

你可以通过自定义AI的遥测处理逻辑,精准过滤掉这类不需要上报的CurlException。下面是两种常用的方法:

方法1:自定义TelemetryInitializer

这个方法可以修改遥测数据,清除掉特定的异常标记,或者将依赖调用标记为成功:

public class FilterCurlExceptionInitializer : ITelemetryInitializer
{
    public void Initialize(ITelemetry telemetry)
    {
        // 只处理依赖类型的遥测数据
        if (telemetry is DependencyTelemetry dependencyTelemetry)
        {
            // 检查异常是否为CurlException
            if (dependencyTelemetry.Exception is System.Net.Http.CurlException)
            {
                // 根据你的业务逻辑判断:比如如果响应状态码是2xx,说明请求实际成功了
                if (!string.IsNullOrEmpty(dependencyTelemetry.ResultCode) && 
                    dependencyTelemetry.ResultCode.StartsWith("2"))
                {
                    // 清除异常,标记为成功
                    dependencyTelemetry.Exception = null;
                    dependencyTelemetry.Success = true;
                }
            }
        }
    }
}

然后在Startup.cs中注册这个Initializer:

public void ConfigureServices(IServiceCollection services)
{
    services.AddApplicationInsightsTelemetry();
    // 添加自定义的遥测初始化器
    services.AddSingleton<ITelemetryInitializer, FilterCurlExceptionInitializer>();
    
    // 其他服务配置...
}

方法2:自定义TelemetryProcessor

这个方法可以直接过滤掉不需要上报的遥测数据,彻底阻止这类异常进入AppInsights:

public class FilterCurlExceptionProcessor : ITelemetryProcessor
{
    private readonly ITelemetryProcessor _nextProcessor;

    public FilterCurlExceptionProcessor(ITelemetryProcessor nextProcessor)
    {
        _nextProcessor = nextProcessor;
    }

    public void Process(ITelemetry telemetryItem)
    {
        if (telemetryItem is DependencyTelemetry dependencyTelemetry)
        {
            // 如果是CurlException且请求实际成功,跳过上报
            if (dependencyTelemetry.Exception is System.Net.Http.CurlException &&
                dependencyTelemetry.ResultCode?.StartsWith("2") == true)
            {
                return; // 不传递这个遥测数据,即不上报
            }
        }

        // 其他遥测数据正常传递
        _nextProcessor.Process(telemetryItem);
    }
}

注册这个Processor到Startup.cs:

public void ConfigureServices(IServiceCollection services)
{
    services.AddApplicationInsightsTelemetry();
    // 添加自定义遥测处理器
    services.AddApplicationInsightsTelemetryProcessor<FilterCurlExceptionProcessor>();
    
    // 其他服务配置...
}

总结

这两种方法都能在保留其他依赖追踪功能的前提下,精准过滤掉那些干扰日志的CurlException上报。你可以根据自己的需求选择:如果只是不想看到异常标记但保留依赖记录,用Initializer;如果想彻底移除这类记录,用Processor。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:54:04