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

.NET 8升级后HttpClient调用GetAsync等方法间歇性抛FormatException

解决.NET 8中HttpClient调用间歇性System.FormatException异常

异常根源分析

从异常栈跟踪可明确,问题并非HttpClient请求发送逻辑导致,而是Prometheus的MeterAdapter组件处理.NET 8新增的HttpClient内置Metrics时格式解析失败:
-.NET 8默认启用HttpClient的Metrics功能,自动生成的指标描述文本包含格式化占位符(如{0})
-Prometheus的TranslateInstrumentDescriptionToPrometheusHelp方法尝试用StringBuilder.AppendFormat解析这些描述,但未提供对应参数,触发System.FormatException
-异常发生在Instrument首次发布或MetricsHandler初始化阶段,因此呈现间歇性特征,且请求并未实际发送

解决方案

方案1:禁用HttpClient内置Metrics

若无需HttpClient的Metrics监控,可直接禁用该功能:

  • 针对单个HttpClient配置:
services.AddHttpClient("YourClientName")
        .DisableMetrics();
  • 全局禁用所有HttpClient的Metrics:
services.Configure<HttpClientMetricsOptions>(options =>
{
    options.Enabled = false;
});

方案2:更新Prometheus.NET库到最新版本

该问题属于Prometheus.NET与.NET 8 HttpClient Metrics的兼容性Bug,官方已在新版本中修复。直接更新Prometheus NuGet包至最新稳定版即可解决格式解析问题。

方案3:自定义处理Metrics描述(兼容旧版Prometheus库)

若无法升级Prometheus包,可通过自定义MeterListener拦截HttpClient的Instrument发布,修改描述文本避免格式解析错误:

var listener = new MeterListener();
listener.InstrumentPublished = (instrument, listener) =>
{
    if (instrument.Meter.Name == "System.Net.Http")
    {
        // 移除或替换描述中的格式化占位符
        var fixedDescription = instrument.Description?.Replace("{0}", "") ?? string.Empty;
        listener.EnableMeasurementEvents(instrument);
    }
};
listener.Start();

注:此方法复杂度较高,仅作为前两种方案的备选。

验证

应用上述任一修复后,重复调用HttpClient的GetAsync/PostAsync/SendAsync方法,确认异常不再出现,且请求正常发送。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 22:02:43