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

Polly与HttpClient集成重试次数超限,持续重试至超时问题排查

问题原因

核心问题在于**AddPolicyHandler策略注册的作用范围与执行上下文不匹配**:

  1. 当使用AddPolicyHandler为类型化客户端绑定策略时,策略是附加到HttpClient的SendAsync方法上的。如果你的MyHttpClient内部的HTTP请求方法(如PostAsync)没有直接使用注入的_httpClient,而是重新创建了HttpClient实例,那么配置的Polly策略根本不会生效,反而可能存在其他未被管控的重试逻辑导致无限重试。
  2. 另一种可能是策略被重复注册:如果你的服务注册逻辑中多次调用了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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 02:22:01