Правильнее определить первичный HttpMessageHandler с помощью метода ConfigurePrimaryHttpMessageHandler () HttpClientBuilder.См. Пример ниже, чтобы настроить типизированный клиент как.
services.AddHttpClient<TypedClient>()
.ConfigureHttpClient((sp, httpClient) =>
{
var options= sp.GetRequiredService<IOptions<SomeOptions>>().Value;
httpClient.BaseAddress = platformEndpointOptions.Url;
httpClient.Timeout = platformEndpointOptions.RequestTimeout;
})
.SetHandlerLifetime(TimeSpan.FromMinutes(5))
.ConfigurePrimaryHttpMessageHandler(x => new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate })
.AddHttpMessageHandler(sp => sp.GetService<SomeCustomHandler>().CreateAuthHandler())
.AddPolicyHandlerFromRegistry(PollyPolicyName.HttpRetry)
.AddPolicyHandlerFromRegistry(PollyPolicyName.HttpCircuitBreaker);
Также вы можете определить политику обработки ошибок с помощью специальных методов построения библиотеки Polly.В этом примере политика должна быть предопределена и сохранена в службе реестра политик.
public static IServiceCollection AddPollyPolicies(this IServiceCollection services, Action<PollyPoliciesOptions> setupAction = null)
{
var policyOptions = new PollyPoliciesOptions();
setupAction?.Invoke(policyOptions);
var policyRegistry = services.AddPolicyRegistry();
policyRegistry.Add(
PollyPolicyName.HttpRetry,
HttpPolicyExtensions
.HandleTransientHttpError()
.WaitAndRetryAsync(
policyOptions.HttpRetry.Count,
retryAttempt => TimeSpan.FromSeconds(Math.Pow(policyOptions.HttpRetry.BackoffPower, retryAttempt))));
policyRegistry.Add(
PollyPolicyName.HttpCircuitBreaker,
HttpPolicyExtensions
.HandleTransientHttpError()
.CircuitBreakerAsync(
handledEventsAllowedBeforeBreaking: policyOptions.HttpCircuitBreaker.ExceptionsAllowedBeforeBreaking,
durationOfBreak: policyOptions.HttpCircuitBreaker.DurationOfBreak));
return services;
}