web-dev-qa-db-ja.com

.NET CoreでHttpClientFactoryでHttpClientHandlerを使用する方法

.NET Core 2.1で利用可能なHttpClientFactoryを使用したいが、HttpClientHandlerを作成するときにAutomaticDecompressionプロパティを利用するためにHttpClientsも使用したい。

.AddHttpMessageHandler<>DelegatingHandlerではなくHttpClientHandlerを取ります。

誰もこれを機能させる方法を知っていますか?

ありがとう、ジム

14
Jim Fritchman

実際に私は自動解凍を使用していませんが、これを達成する方法はhttpクライアントを適切に登録することです

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

HttpClientBuilderのConfigurePrimaryHttpMessageHandler()メソッドを使用して、プライマリHttpMessageHandlerをより適切に定義します。型付きクライアントの構成方法については、以下の例を参照してください。

  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ライブラリの特別なBuilderメソッドを使用して、エラー処理ポリシーを定義できます。この例では、ポリシーを事前定義して、ポリシーレジストリサービスに保存する必要があります。

  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