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
相关产品推荐
相关产品推荐

