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