RestSharp结合Polly如何按响应状态码配置差异化重试策略
实现方式
完全可以实现,你不需要使用固定等待时长数组的WaitAndRetryAsync重载,Polly提供了支持根据执行结果、重试次数动态计算等待间隔的重载,刚好可以满足按状态码区分等待时长的需求。
首先需要修正你原有代码里的重试判定逻辑问题:当前写的!response.IsSuccessful || response.StatusCode != System.Net.HttpStatusCode.Conflict存在逻辑错误,只要响应状态码不是Conflict,无论请求是否成功都会触发重试,你可以根据实际业务调整需要重试的状态码判定规则。
符合需求的参考实现如下:
// 按需求配置最大重试次数:非500场景重试2次(对应2秒、4秒等待),500场景单独走3分钟等待逻辑 var retryPolicy = Policy .HandleResult<RestResponse>(response => { // 替换为你实际的重试判定规则,示例规则:请求失败 且 状态码不是无需重试的409 Conflict return !response.IsSuccessful && response.StatusCode != System.Net.HttpStatusCode.Conflict; }) .WaitAndRetryAsync( retryCount: 3, sleepDurationProvider: (retryAttempt, responseResult, _) => { // 识别到响应为500内部错误时,固定等待3分钟再重试 if (responseResult.Result.StatusCode == System.Net.HttpStatusCode.InternalServerError) { return TimeSpan.FromMinutes(3); } // 其余可重试场景,按重试次数返回对应等待时长:第一次等2秒,第二次等4秒 return retryAttempt switch { 1 => TimeSpan.FromSeconds(2), 2 => TimeSpan.FromSeconds(4), _ => TimeSpan.Zero }; }, onRetryAsync: (_, waitDuration, retryCount, _) => { // 可选:在这里添加重试日志、监控上报逻辑,比如记录当前重试次数、等待时长 return Task.CompletedTask; } );
配置注意事项
- 如果你需要让500场景的重试次数和普通场景独立计数,可以在传入的Polly上下文
Context中添加自定义标记位,单独记录500场景的重试次数,避免和普通重试的计数混淆 - 3分钟的等待间隔较长,如果你同时配置了超时策略,需要同步调整超时阈值,避免还未触发重试就被全局超时终止
- 如果请求抛出异常(比如网络错误没有拿到有效响应),也可以在
sleepDurationProvider中补充异常判断逻辑,给这类场景单独配置等待时长
内容的提问来源于stack exchange,提问作者user1094183
相关产品推荐
相关产品推荐

