我有与
HttpClient
相关的 Polly 设置,这样定义
public static IHttpClientBuilder WithResiliencePolicies(
this IHttpClientBuilder clientBuilder,
ResiliencePoliciesSettings? settings = null
)
{
settings ??= new ResiliencePoliciesSettings();
return clientBuilder
.AddHttpMessageHandler(sp =>
{
var loggerFactory = sp.GetService<ILoggerFactory>();
return new PollyContextDelegatingHandler(loggerFactory?.CreateLogger(clientBuilder.Name));
})
.AddTimeoutPolicy(settings.OverallTimeout)
.AddRetryPolicy(settings.RetryPolicySettings)
.AddCircuitBreakerPolicy(settings.CircuitBreakerPolicySettings)
.AddTimeoutPolicy(settings.TimeoutPerTry);
}
//...
builder.Services
.AddHttpClient(nameof(MyHttpClient))
.WithResiliencePolicies();
这样我用某种默认设置定义
HttpClientFactory
。
我可以照常使用它
using var httpClient = _httpClientFactory.CreateClient(nameof(MyHttpClient));
问题是:
如果我想为每个
HttpClient
实例覆盖其中一些默认设置,我该怎么办?
例如,它可以是超时值或重试设置。
通过这种方式,我使用某种默认设置定义了 HttpClientFactory。
那是不正确的。由于您使用字符串参数调用了
AddHttpClient
,这就是您注册命名客户端的原因。如果您调用无参数版本,那么您的陈述将更接近现实。
另外请记住,因为您已经注册了命名客户端,所以您也必须为
CreateClient
调用提供相同的字符串。
如果我想为每个 HttpClient 实例覆盖其中一些默认设置,我应该怎么做?
策略定义被认为是不可变的。制定政策后,您将无法更改它。此外,您甚至无法访问创建期间使用的那些值。:((希望这将在 v8 中修复)。
因此,您需要注册与要使用的不同设置一样多的命名 HttpClients。