如何在通过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
相关产品推荐
相关产品推荐

