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

如何让Polly HTTP断路器仅在超时异常时触发熔断?

解决方案

要实现仅在超时异常(及超时响应)时触发熔断,你需要移除HandleTransientHttpError()(它会包含5XX等非超时错误),转而精确指定需要处理的超时相关场景:

  1. 处理HttpClient请求超时抛出的TaskCanceledException(这是HttpClient超时的典型异常类型)
  2. 处理响应状态码为408 RequestTimeout的情况(如果服务返回超时响应)

修改后的代码如下:

IAsyncPolicy<HttpResponseMessage> circuitBreaker = Policy
    .Handle<TaskCanceledException>() // 捕获请求超时导致的取消异常
    .OrResult(msg => msg.StatusCode == HttpStatusCode.RequestTimeout) // 捕获服务返回的超时响应
    .AdvancedCircuitBreakerAsync(
        failureThreshold: 0.25,
        samplingDuration: TimeSpan.FromSeconds(300),
        minimumThroughput: 50,
        durationOfBreak: TimeSpan.FromSeconds(20));

services.AddHttpClient<IFinancialDetailsService, FinancialDetailsService>()
        .AddPolicyHandler(circuitBreaker);

补充说明

如果你的场景中,超时异常可能被包装为HttpRequestException(部分.NET版本或特定配置下可能出现),可以额外添加对该异常的过滤判断:

.Or<HttpRequestException>(ex => 
    ex.InnerException is TaskCanceledException && !((TaskCanceledException)ex.InnerException).CancellationToken.IsCancellationRequested)

这段代码用于识别由超时而非手动取消导致的HttpRequestException。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 10:37:13