覆盖用Polly定义的HttpClientFactory策略

时间:2020-01-24 14:41:38

标签: c# .net .net-core polly resiliency

从.net Core 2+开始,MS为我们提供了一种向HttpClient添加策略的方法,只要客户端是通过IOC容器注入的,它就可以使用。但这使我怀疑,我在不断地谷歌搜索时似乎无法弄清楚。如果我们想在仍然使用HttpClientFactory和DI将客户端注入提供程序的同时重写HttpClient策略怎么办?我们可以“关闭”特定请求的策略,还是可以添加其他策略,同时覆盖启动中定义的全局策略?

1 个答案:

答案 0 :(得分:1)

使用不同的named clientstyped clients来定义单独的逻辑HttpClient配置。

OR

使用IHttpClientFactory配置策略时,可以使用.AddPolicyHandler(...) overloads.AddPolicyHandlerFromRegistry(...) overloads,它们允许您根据HttpRequestMessage中的信息选择策略。这可以允许更改适用于不同请求的策略。

Polly and HttpClientFactory documentation为例,一个用例可能是仅将重试策略应用于GET请求,而不应用于其他http动词:

var retryPolicy = HttpPolicyExtensions
    .HandleTransientHttpError()
    .WaitAndRetryAsync(new[]
    {
        TimeSpan.FromSeconds(1),
        TimeSpan.FromSeconds(5),
        TimeSpan.FromSeconds(10)
    });
var noOpPolicy = Policy.NoOpAsync().AsAsyncPolicy<HttpResponseMessage>();

services.AddHttpClient(/* etc */)
    // Select a policy based on the request: retry for Get requests, noOp for other http verbs.
    .AddPolicyHandler(request => request.Method == HttpMethod.Get ? retryPolicy : noOpPolicy);