无需ServiceCollection与IoC,如何创建带Polly策略的HttpClient?
无IoC/ServiceCollection场景下构建带Polly策略的HttpClient
首先要明确:IHttpClientBuilder是和ServiceCollection/DI容器深度绑定的类型,它的设计初衷就是在依赖注入体系内配置HttpClient。所以无DI场景下,硬造IHttpClientBuilder既不现实也没必要——直接手动把Polly策略和HttpClient结合更简单。
方法一:完全无DI,手动组合Polly策略与HttpClient
跳过AddPolicyHandler扩展,直接用Polly原生的PolicyHttpMessageHandler来包装策略,再传入HttpClient:
using Polly; using Polly.Extensions.Http; using System.Net.Http; // 1. 定义你需要的Polly策略(这里以重试为例) var retryPolicy = HttpPolicyExtensions .HandleTransientHttpError() // 捕获常见的瞬时HTTP错误(5xx、408等) .WaitAndRetryAsync(3, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt))); // 2. 创建Polly消息处理器,指定内部处理器(必须设置,否则HttpClient无法发请求) var policyHandler = new PolicyHttpMessageHandler(retryPolicy) { InnerHandler = new HttpClientHandler() }; // 3. 实例化带策略的HttpClient var httpClient = new HttpClient(policyHandler); // 调用示例 var response = await httpClient.GetAsync("https://api.example.com"); response.EnsureSuccessStatusCode();
这种方式完全脱离DI容器,直接通过PolicyHttpMessageHandler把Polly策略注入到HttpClient的请求管道中,是无IoC场景下的最优解。
方法二:临时使用ServiceCollection调用AddPolicyHandler(若一定要用该扩展)
如果你非要调用AddPolicyHandler扩展方法,只能临时创建一个轻量级的ServiceCollection容器,注册完后再提取HttpClient:
using Microsoft.Extensions.DependencyInjection; using Polly; using Polly.Extensions.Http; using System.Net.Http; // 1. 临时创建ServiceCollection并配置HttpClient和策略 var services = new ServiceCollection(); services.AddHttpClient("PollyClient") .AddPolicyHandler(HttpPolicyExtensions .HandleTransientHttpError() .WaitAndRetryAsync(3, i => TimeSpan.FromSeconds(i))); // 2. 构建服务提供者并获取HttpClientFactory var serviceProvider = services.BuildServiceProvider(); var httpClientFactory = serviceProvider.GetRequiredService<IHttpClientFactory>(); var httpClient = httpClientFactory.CreateClient("PollyClient"); // 3. 使用后记得释放容器资源(控制台等场景) await serviceProvider.DisposeAsync();
注意:这种方式本质还是用到了DI容器,只是临时创建了一个,适合你一定要用AddPolicyHandler扩展的场景,但不如方法一直接。
内容的提问来源于stack exchange,提问作者Node.JS
相关产品推荐
相关产品推荐

