.NET 6中Autofac容器配置HttpClient Polly重试策略无效问题排查
问题分析与解决方案
你的代码无法触发重试的核心问题在于HttpClient策略的配置时机错误,以及客户端实例获取方式不符合Polly与HttpClient集成的规范,具体问题和修正如下:
核心问题点
IHttpClientBuilder的配置时机错误
你在Autofac容器注册阶段Resolve<IHttpClientBuilder>()后调用AddPolicyHandler是无效的。IHttpClientBuilder是在ServiceCollection构建阶段用来配置HttpClient的,当你创建Autofac容器时,ServiceCollection的配置已经完成,此时再修改HttpClientBuilder不会生效。未获取配置了策略的HttpClient实例
你注册的HttpClient是直接通过IHttpClientFactory.CreateClient()获取的默认客户端,这个客户端并没有关联你定义的重试策略。
修正后的代码
1. 调整策略定义(修复异步回调问题)
首先修正重试回调中的异步操作未等待的问题:
static IAsyncPolicy<HttpResponseMessage> GetRetryPolicy() { return HttpPolicyExtensions .HandleTransientHttpError() .OrResult(msg => msg.StatusCode != System.Net.HttpStatusCode.OK) .WaitAndRetryAsync(6, retryAttempt => TimeSpan.FromSeconds(retryAttempt), async (exception, timeSpan, retryCount, context) => { // 添加await确保延迟操作完成 await Task.Delay(5000); }); }
2. 正确配置DI注册
在ServiceCollection阶段就为HttpClient附加策略,再通过Autofac集成:
var services = new ServiceCollection(); // 方式1:为所有默认HttpClient配置策略 services.AddHttpClient() .AddPolicyHandler(GetRetryPolicy()); // 方式2:创建命名客户端,更灵活(推荐) // services.AddHttpClient("PolicyEnabledClient") // .AddPolicyHandler(GetRetryPolicy()); var providerFactory = new AutofacServiceProviderFactory(); ContainerBuilder builder = providerFactory.CreateBuilder(services); // 注册HttpClient:如果用默认客户端,直接Resolve;如果用命名客户端,指定名称 builder.Register(c => c.Resolve<IHttpClientFactory>().CreateClient()) .As<HttpClient>(); // 如果用命名客户端,注册方式改为: // builder.Register(c => c.Resolve<IHttpClientFactory>().CreateClient("PolicyEnabledClient")) // .As<HttpClient>(); // 构建容器 var container = builder.Build();
验证逻辑
当你通过容器获取HttpClient实例后,发起非200的请求或者 transient 错误(比如5xx、网络超时)时,重试策略会被触发,你可以在回调中添加日志来确认重试行为。
内容的提问来源于stack exchange,提问作者TechMama
相关产品推荐
相关产品推荐

