如何让Polly HTTP断路器仅在超时异常时触发熔断?
解决方案
要实现仅在超时异常(及超时响应)时触发熔断,你需要移除HandleTransientHttpError()(它会包含5XX等非超时错误),转而精确指定需要处理的超时相关场景:
- 处理HttpClient请求超时抛出的
TaskCanceledException(这是HttpClient超时的典型异常类型) - 处理响应状态码为
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
相关产品推荐
相关产品推荐

