.NET Core 2.1で利用可能なHttpClientFactory
を使用したいが、HttpClientHandler
を作成するときにAutomaticDecompression
プロパティを利用するためにHttpClients
も使用したい。
.AddHttpMessageHandler<>
はDelegatingHandler
ではなくHttpClientHandler
を取ります。
誰もこれを機能させる方法を知っていますか?
ありがとう、ジム
実際に私は自動解凍を使用していませんが、これを達成する方法はhttpクライアントを適切に登録することです
services.AddHttpClient<MyCustomHttpClient>()
.ConfigureHttpMessageHandlerBuilder((c) =>
new HttpClientHandler()
{
AutomaticDecompression = System.Net.DecompressionMethods.GZip
}
)
.AddHttpMessageHandler((s) => s.GetService<MyCustomDelegatingHandler>())
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;
}