web-dev-qa-db-fra.com

Comment utiliser HttpClientHandler avec HttpClientFactory dans .NET Core

Je veux utiliser le HttpClientFactory qui est disponible dans .NET Core 2.1 mais je veux également utiliser le HttpClientHandler pour utiliser la propriété AutomaticDecompression lors de la création de HttpClients .

J'ai du mal parce que le .AddHttpMessageHandler<> prend un DelegatingHandler pas un HttpClientHandler.

Est-ce que quelqu'un sait comment faire fonctionner cela?

Merci, Jim

14
Jim Fritchman

En fait, je n'utilise pas la décompression automatique, mais le moyen d'y parvenir est d'enregistrer correctement le client http

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

Plus correctement pour définir HttpMessageHandler principal via la méthode ConfigurePrimaryHttpMessageHandler () de HttpClientBuilder. Voir l'exemple ci-dessous pour configurer le client typé.

  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);

Vous pouvez également définir une politique de gestion des erreurs via l'utilisation de méthodes de génération spéciales de la bibliothèque Polly. Dans cet exemple, la stratégie doit être prédéfinie et stockée dans le service de registre de stratégie.

  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;
    }
2
trueboroda