HttpClient 的每个实例的自定义 Polly 设置

问题描述 投票:0回答:1

我有与

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
实例覆盖其中一些默认设置,我该怎么办? 例如,它可以是超时值或重试设置。

c# .net dotnet-httpclient polly
1个回答
0
投票

通过这种方式,我使用某种默认设置定义了 HttpClientFactory。

那是不正确的。由于您使用字符串参数调用了

AddHttpClient
,这就是您注册命名客户端的原因。如果您调用无参数版本,那么您的陈述将更接近现实。

另外请记住,因为您已经注册了命名客户端,所以您也必须为

CreateClient
调用提供相同的字符串。

如果我想为每个 HttpClient 实例覆盖其中一些默认设置,我应该怎么做?

策略定义被认为是不可变的。制定政策后,您将无法更改它。此外,您甚至无法访问创建期间使用的那些值。:((希望这将在 v8 中修复)。

因此,您需要注册与要使用的不同设置一样多的命名 HttpClients。

© www.soinside.com 2019 - 2024. All rights reserved.