如何为工厂类创建的Refit Client添加Polly策略?
解决方案
完全可以在工厂创建Refit客户端的场景下添加Polly策略,以下是两种可行实现方案:
方案1:手动组装HttpClient与消息处理器(完全无需提前在DI中注册)
RestService.For支持直接传入预配置好的HttpClient实例,你只需要把Polly策略封装为PolicyHttpMessageHandler绑定到HttpClient即可:
// 工厂类内的实现逻辑 public IMyRefitClient CreateClient(string hostUrl) { // 1. 将Polly策略包装为HTTP消息处理器 var retryHandler = new PolicyHttpMessageHandler(PollyHelpers.GetRetryPolicy()) { // 配置内层处理器,如有其他自定义处理器可在此处链式嵌套 InnerHandler = new HttpClientHandler() }; // 2. 创建绑定了策略处理器的HttpClient,设置动态获取的服务地址 var httpClient = new HttpClient(retryHandler) { BaseAddress = new Uri(hostUrl) }; // 3. 生成Refit客户端实例 return RestService.For<IMyRefitClient>(httpClient); }
注意:此方案需要手动管理HttpClient的生命周期,建议复用HttpClient实例避免端口耗尽问题;如果需要叠加多个策略,可直接传入合并后的
PolicyWrap实例,或者嵌套多层PolicyHttpMessageHandler。
依赖要求:需要提前安装NuGet包Microsoft.Extensions.Http.Polly
方案2:结合DI注册能力动态赋值地址(推荐)
你依然可以在ConfigureServices中提前注册Refit客户端的配置(只不设置固定BaseAddress),运行时从DI中获取预配置好的HttpClient再赋值动态地址即可:
第一步:DI注册(Program.cs中)
// 正常注册Refit客户端与Polly策略,无需指定BaseAddress services.AddRefitClient<IMyRefitClient>() .AddPolicyHandler(PollyHelpers.GetRetryPolicy());
第二步:工厂类实现
// 工厂类注入IServiceProvider public class MyRefitClientFactory { private readonly IServiceProvider _serviceProvider; public MyRefitClientFactory(IServiceProvider serviceProvider) { _serviceProvider = serviceProvider; } public IMyRefitClient CreateClient(string hostUrl) { // 1. 从DI获取HttpClient工厂,创建预配置了策略的客户端 var httpClientFactory = _serviceProvider.GetRequiredService<IHttpClientFactory>(); var httpClient = httpClientFactory.CreateClient(typeof(IMyRefitClient).Name); // 2. 赋值运行时获取的服务地址 httpClient.BaseAddress = new Uri(hostUrl); // 3. 生成Refit客户端 return RestService.For<IMyRefitClient>(httpClient); } }
优势:此方案复用了ASP.NET Core自带的HttpClient生命周期管理逻辑,自动避免端口耗尽、DNS更新不及时等问题,同时支持复用DI中注册的所有全局HttpClient配置。
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

