Как использовать HttpClientHandler с HttpClientFactory в.NET Core
Я хочу использовать HttpClientFactory
который доступен в.NET Core 2.1, но я также хочу использовать HttpClientHandler
использовать AutomaticDecompression
свойство при создании HttpClients
,
Я борюсь, потому что .AddHttpMessageHandler<>
занимает DelegatingHandler
не HttpClientHandler
,
Кто-нибудь знает, как заставить это работать?
Спасибо джим
1 ответ
На самом деле я не использую автоматическую декомпрессию, но способ добиться этого - правильно зарегистрировать http-клиент
services.AddHttpClient<MyCustomHttpClient>()
.ConfigureHttpMessageHandlerBuilder((c) =>
new HttpClientHandler()
{
AutomaticDecompression = System.Net.DecompressionMethods.GZip
}
)
.AddHttpMessageHandler((s) => s.GetService<MyCustomDelegatingHandler>())
Более правильно определить первичный 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;
}