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

如何为工厂类创建的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 03:15:03