0

0

C# Polly策略使用方法 C#如何实现Http请求的重试和熔断

月夜之吻

月夜之吻

发布时间:2026-01-25 11:30:02

|

145人浏览过

|

来源于php中文网

原创

重试策略需显式设次数、指数退避和总超时;熔断器须自定义shouldHandle识别业务错误;重试与熔断须用PolicyWrapAsync组合,外熔断内重试;HttpClient超时应设为MaxValue交由Polly控制。

c# polly策略使用方法 c#如何实现http请求的重试和熔断

重试策略怎么配才不卡死请求

默认的 RetryPolicy 不设超时或重试间隔,容易让请求卡住几秒甚至更久。必须显式控制重试次数、退避方式和总耗时上限。

  • WaitAndRetryAsync 配合指数退避(如 Backoff.DecorrelatedJitterBackoffV2),避免下游雪崩式重试
  • HttpClient 外层加 CancellationToken,并传给 ExecuteAsync,防止策略内部无限等待
  • 别只靠重试次数限制——加上 TimeSpan.FromMilliseconds(3000) 这类硬性超时,否则网络卡顿时策略会等满所有重试周期
  • 示例中常见错误:把 HttpRequestExceptionTaskCanceledException 混在一起重试,其实后者大概率是上游已取消,再试没意义

熔断器触发后为什么还在发请求

CircuitBreakerPolicy 默认只对异常类型生效,HTTP 200 但业务返回 {"code":500} 这类“假成功”不会触发熔断,得手动判断响应内容。

  • AdvancedCircuitBreakerAsync,配合自定义 shouldHandle 函数,检查 response.IsSuccessStatusCode == false 或解析 JSON 后判断 responseContent.code != 0
  • 熔断状态不是全局共享的——每个 HttpClient 实例或每个策略实例独立维护状态,别误以为配置一次就全应用生效
  • 注意 failureThreshold 是“失败比例”,不是绝对次数;比如设 0.5,意味着最近 10 次里有 5 次失败才会熔断,不是第 5 次就跳闸
  • 熔断后调用会直接抛 BrokenCircuitException,不是静默失败,要确保上层有捕获逻辑,否则可能引发未处理异常崩溃

如何把重试 + 熔断串成一条链

不能简单 new 两个策略然后分别调用——必须用 PolicyWrapAsync 组合,否则熔断器收不到重试后的最终结果,无法准确统计失败率。

Miniflow
Miniflow

AI工作流自动化平台

下载
  • 顺序很重要:外层放熔断(circuitBreaker),内层放重试(retry),这样重试过程中的失败都算进熔断统计
  • 别漏掉 Policy.WrapAsync(retry, circuitBreaker) 的括号方向,写反会导致编译通过但运行时策略不生效
  • 组合后调用 policyWrap.ExecuteAsync(() => httpClient.GetAsync(url)),而不是分别执行两个 ExecuteAsync
  • 如果还加了降级(FallbackPolicy),它应该放在最外层,兜住熔断和重试都失败的情况

HttpClient 与 Polly 怎么共存不冲突

直接给 HttpClient 设置 Timeout 会跟 Polly 的重试逻辑打架——比如 HttpClient 内部 10 秒超时,而 Polly 重试 3 次每次等 2 秒,第三次还没发出去就被 HttpClient 自己扔异常了。

  • HttpClient.Timeout 设为 TimeSpan.MaxValue,把超时控制权完全交给 Polly
  • 每个 HttpClient 实例应绑定一个固定的策略实例(推荐用 DI 注入单例策略),不要每次请求都 new 新策略,否则熔断状态无法累积
  • 如果用了 IHttpClientFactory,在 AddHttpClient 里用 AddPolicyHandler 注册策略,它会自动处理生命周期和策略复用
  • 注意 HttpRequestException 的 InnerException 可能是 SocketExceptionOperationCanceledException,Polly 默认不展开 InnerException,需手动写 ex.InnerException is TimeoutException 这类判断
实际最难调的往往是熔断窗口期和失败判定粒度——比如 60 秒滑动窗口里,你希望 10 次失败就熔断,但如果请求本身很慢,这 10 次可能集中在最后 2 秒发生,导致熔断来得又急又猛,下游根本来不及恢复。这时候得结合指标监控,动态调整参数。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

417

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

535

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

311

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

76

2025.09.10

http500解决方法
http500解决方法

http500解决方法有检查服务器日志、检查代码错误、检查服务器配置、检查文件和目录权限、检查资源不足、更新软件版本、重启服务器或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

398

2023.11.09

http请求415错误怎么解决
http请求415错误怎么解决

解决方法:1、检查请求头中的Content-Type;2、检查请求体中的数据格式;3、使用适当的编码格式;4、使用适当的请求方法;5、检查服务器端的支持情况。更多http请求415错误怎么解决的相关内容,可以阅读下面的文章。

417

2023.11.14

HTTP 503错误解决方法
HTTP 503错误解决方法

HTTP 503错误表示服务器暂时无法处理请求。想了解更多http错误代码的相关内容,可以阅读本专题下面的文章。

2110

2024.03.12

http与https有哪些区别
http与https有哪些区别

http与https的区别:1、协议安全性;2、连接方式;3、证书管理;4、连接状态;5、端口号;6、资源消耗;7、兼容性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2060

2024.08.16

c++ 根号
c++ 根号

本专题整合了c++根号相关教程,阅读专题下面的文章了解更多详细内容。

45

2026.01.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 8.5万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 3.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号