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

Refit与Polly重试配置异常求助:404未触发重试

排查Refit+Polly重试策略不生效(404不触发重试)的问题

问题根源

你的代码里用了AddTransientHttpErrorPolicy,这个策略默认只对网络错误、5xx状态码、408请求超时触发重试,404 Not Found并不在默认的"临时错误"范围内,所以不会触发重试逻辑。另外代码里还有两个没必要的int.Parse调用,属于冗余写法。

修复方案

需要自定义重试的触发条件,把404状态码加入重试判断逻辑,同时简化代码:

services.AddRefitClient<IHttpClient>()
        .ConfigureHttpClient(c => c.BaseAddress = new Uri("https://api.powerbi.com"))
        .AddTransientHttpErrorPolicy(p => 
            p.OrResult(response => response.StatusCode == HttpStatusCode.NotFound) // 新增:匹配404状态码
            .WaitAndRetryAsync(1, // 重试1次(对应预期的"执行一次重试",总共2次请求:原请求+1次重试)
                _ => TimeSpan.FromMilliseconds(5000), 
                (result, timeSpan, retryCount, context) =>
                {
                    Log.Warning($"Request failed: {result.Exception?.Message ?? result.Result.StatusCode.ToString()}. Wait {timeSpan.TotalSeconds}s before retry. Retry attempt {retryCount}.");
                }));

关键修改点说明

  • 添加404匹配条件:通过.OrResult(response => response.StatusCode == HttpStatusCode.NotFound),把404状态码纳入重试触发范围
  • 调整重试次数:把原来的int.Parse(2)改成1,精准匹配你"执行一次重试"的预期(如果传2会重试2次,总共3次请求)
  • 移除冗余的int.Parse:直接用数字1和5000即可,不需要字符串转int的多余操作
  • 完善日志兼容性:当是状态码错误时(比如404),result.Exception会是null,日志里通过?? result.Result.StatusCode.ToString()兼容异常和状态码两种错误场景

扩展提示

如果之后需要添加更多需要重试的状态码(比如429限流),可以继续在.OrResult里扩展:

.OrResult(response => 
    response.StatusCode == HttpStatusCode.NotFound || 
    response.StatusCode == HttpStatusCode.TooManyRequests)

内容的提问来源于stack exchange,提问作者Sabbir Islam Mukdo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 01:43:19