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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 01:24:22