Как использовать HttpClientHandler с HttpClientFactory в .NET Core - PullRequest
0 голосов
/ 07 июня 2018

Я хочу использовать HttpClientFactory, доступный в .NET Core 2.1, но я также хочу использовать HttpClientHandler для использования свойства AutomaticDecompression при создании HttpClients.

.из-за того, что .AddHttpMessageHandler<> берет DelegatingHandler, а не HttpClientHandler.

Кто-нибудь знает, как заставить это работать?

Спасибо, Джим

Ответы [ 2 ]

0 голосов
/ 13 мая 2019

Правильнее определить первичный 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;
    }
0 голосов
/ 08 июня 2018

На самом деле я не использую автоматическую декомпрессию, но способ добиться этого - правильно зарегистрировать http-клиент

services.AddHttpClient<MyCustomHttpClient>()
   .ConfigureHttpMessageHandlerBuilder((c) =>
     new HttpClientHandler()
     {
        AutomaticDecompression = System.Net.DecompressionMethods.GZip
     }
   )
   .AddHttpMessageHandler((s) => s.GetService<MyCustomDelegatingHandler>())
...