Polly与HttpClient集成重试次数超限,持续重试至超时问题排查
问题原因
核心问题在于**AddPolicyHandler策略注册的作用范围与执行上下文不匹配**:
- 当使用
AddPolicyHandler为类型化客户端绑定策略时,策略是附加到HttpClient的SendAsync方法上的。如果你的MyHttpClient内部的HTTP请求方法(如PostAsync)没有直接使用注入的_httpClient,而是重新创建了HttpClient实例,那么配置的Polly策略根本不会生效,反而可能存在其他未被管控的重试逻辑导致无限重试。 - 另一种可能是策略被重复注册:如果你的服务注册逻辑中多次调用了
AddPolicyHandler,或者策略未以单例形式注册,会导致每次请求都创建新的策略实例,重试计数无法正确累计,出现“重置重试次数”的现象。
解决方法
1. 确保MyHttpClient正确使用注入的HttpClient
检查MyHttpClient中的HTTP请求方法,必须直接使用构造注入的_httpClient,禁止在方法内部新建HttpClient:
public class MyHttpClient : IMyHttpClient { private readonly HttpClient _httpClient; private readonly IMemoryCache _cache; public MyHttpClient(HttpClient httpClient, IMemoryCache cache) { _httpClient = httpClient; _cache = cache; } public async Task<HttpResponseMessage> PostAsync(object payload) { var json = JsonSerializer.Serialize(payload); var content = new StringContent(json, Encoding.UTF8, "application/json"); // 直接使用注入的_httpClient,确保Polly策略生效 return await _httpClient.PostAsync("/target-api", content); } }
2. 使用单例策略注册避免重复创建
将重试策略注册为单例,再绑定到HttpClient,确保所有请求复用同一个策略实例:
// 先注册单例重试策略 services.AddSingleton<IAsyncPolicy<HttpResponseMessage>>(sp => { var config = sp.GetRequiredService<IConfiguration>(); int retryCount = Convert.ToInt32(config["PollyRetries"]); TimeSpan delay = TimeSpan.FromSeconds(Convert.ToInt32(config["PollyMaxDelaySeconds"])); return HttpPolicyExtensions .HandleTransientHttpError() .WaitAndRetryAsync( retryCount, _ => delay, (response, span, retryNum, context) => { Log.Information("Attempt # {RetryNum}", retryNum); }); }); // 绑定策略到类型化客户端 services.AddHttpClient<IMyHttpClient, MyHttpClient>() .AddPolicyHandler(sp => sp.GetRequiredService<IAsyncPolicy<HttpResponseMessage>>());
3. 改用官方推荐的AddTransientHttpErrorPolicy
微软推荐使用AddTransientHttpErrorPolicy简化重试策略配置,该方法会自动处理策略的单例注册与绑定,避免手动配置出错:
services.AddHttpClient<IMyHttpClient, MyHttpClient>() .AddTransientHttpErrorPolicy(policyBuilder => policyBuilder.WaitAndRetryAsync( 3, _ => TimeSpan.FromSeconds(3), (response, span, retryCount, context) => { Log.Information("Attempt # {retryCount}", retryCount); }));
4. 排查策略重复注册问题
检查你的Startup或其他服务注册类,确保没有多次调用AddPolicyHandler或重复配置同一类型化客户端的策略。可以通过在策略注册时添加日志,确认策略实例是否只被创建一次。
内容的提问来源于stack exchange,提问作者SoumyaGhosh
相关产品推荐
相关产品推荐

