如何将 Polly 与 Refit 一起使用?

How to use Polly with Refit?

提问人:Ivan Debono 提问时间:8/4/2023 最后编辑:Peter CsalaIvan Debono 更新时间:8/4/2023 访问量:128

问:

我没有使用 中的服务配置我的 Refit 客户端。我正在做以下工作:Startup

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

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

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

我需要将 Polly 策略添加到客户端。在使用 ?RestService.For<>

c# Blazor dotnet-httpclient 波莉 改装

评论


答:

0赞 Peter Csala 8/4/2023 #1

通常,每当您注册一个用 Polly 策略(或策略链)装饰的命名/键入时,您都会像这样执行操作HttpClient

.AddHttpClient<XYZ>()
.AddPolicyHandler(...); 

使用指定的 Polly 策略注册 a。(参考文献AddPolicyHandlerPolicyHttpMessageHandler)

因此,您可以在此处执行相同的操作:

var combinedPolicy = Policy.WrapAsync(retryPolicy, timeoutPolicy);
var outerHandler = new PolicyHttpMessageHandler(combinedPolicy);
outerHandler.InnerHandler = (DelegatingHandler)myHandler;

然后,您可以在通话中使用outerHandlerRestService.For

RestService.For<IMyService>(new HttpClient(outerHandler))

我还没有测试过它,但运行时可能需要您将最内部的处理程序设置为新的 HttpClientHandler 才能正常工作。