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

如何在通过RestService.For<>创建Refit客户端时集成Polly策略?

在RestService.For创建Refit客户端时添加Polly策略

你可以通过Polly的PolicyHttpMessageHandler将策略注入到HttpClient中,再把这个HttpClient传给Refit的RestService.For方法,具体实现如下:

1. 组合Polly策略

先将重试和超时策略组合为一个策略包裹,确保每次重试的请求都能触发超时限制:

var retryPolicy = HttpPolicyExtensions
    .HandleTransientHttpError()
    .Or<TimeoutRejectedException>()
    .WaitAndRetryAsync(2, _ => TimeSpan.FromMilliseconds(500));

var timeoutPolicy = Policy
    .TimeoutAsync<HttpResponseMessage>(TimeSpan.FromMilliseconds(500));

// 外层为重试策略,内层为超时策略——每次重试的独立请求都会被超时限制约束
var combinedPolicy = Policy.WrapAsync(retryPolicy, timeoutPolicy);

2. 创建带Polly策略的HttpHandler

用组合后的策略生成PolicyHttpMessageHandler,并将你现有自定义的myHandler设置为它的内部处理器,保留原有handler的业务逻辑:

var pollyEnabledHandler = new PolicyHttpMessageHandler(combinedPolicy)
{
    InnerHandler = myHandler
};

3. 生成带策略的Refit客户端

将增强后的handler传入HttpClient,再传递给RestService.For完成客户端创建:

public Task<IMyService> GetService()
{
    var retryPolicy = HttpPolicyExtensions
        .HandleTransientHttpError()
        .Or<TimeoutRejectedException>()
        .WaitAndRetryAsync(2, _ => TimeSpan.FromMilliseconds(500));

    var timeoutPolicy = Policy
        .TimeoutAsync<HttpResponseMessage>(TimeSpan.FromMilliseconds(500));

    var combinedPolicy = Policy.WrapAsync(retryPolicy, timeoutPolicy);

    var pollyEnabledHandler = new PolicyHttpMessageHandler(combinedPolicy)
    {
        InnerHandler = myHandler
    };

    return Task.FromResult(RestService.For<IMyService>(new HttpClient(pollyEnabledHandler)
    {
        BaseAddress = new Uri(myUrl)
    }, new RefitSettings()));
}

关键说明

  • Policy.WrapAsync的顺序直接影响策略执行逻辑:外层策略先触发,内层策略作用于单次请求,这里的组合方式能保证每一次重试请求都受到超时限制。
  • 若你的myHandler是自定义DelegatingHandler,这种嵌套方式完全兼容,不会破坏原有逻辑。

内容的提问来源于stack exchange,提问作者Ivan Debono

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 03:05:21