Resilience mechanisms for HttpClient.
$ dotnet add package Microsoft.Extensions.Http.ResilienceResilience mechanisms for HttpClient built on the Polly framework.
From the command-line:
dotnet add package Microsoft.Extensions.Http.Resilience
Or directly in the C# project file:
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Http.Resilience" Version="[CURRENTVERSION]" />
</ItemGroup>
When configuring an HttpClient through the HTTP client factory the following extensions can add a set of pre-configured hedging or resilience behaviors. These pipelines combine multiple resilience strategies with pre-configured defaults.
The standard resilience pipeline makes use of the above strategies to ensure HTTP requests can be sent reliably.
var clientBuilder = services.AddHttpClient("MyClient");
clientBuilder.AddStandardResilienceHandler().Configure(o =>
{
o.CircuitBreaker.MinimumThroughput = 10;
});
The standard hedging pipeline uses a pool of circuit breakers to ensure that unhealthy endpoints are not hedged against. By default, the selection from pool is based on the URL Authority (scheme + host + port). It is recommended that you configure the way the strategies are selected by calling the SelectPipelineByAuthority() extensions. The last three strategies are applied to each individual endpoint.
var clientBuilder = services.AddHttpClient("MyClient");
clientBuilder.AddStandardHedgingHandler().Configure(o =>
{
o.TotalRequestTimeout.Timeout = TimeSpan.FromSeconds(10);
});
For more granular control a custom pipeline can be constructed.
var clientBuilder = services.AddHttpClient("MyClient");
clientBuilder.AddResilienceHandler("myHandler", b =>
{
b.AddFallback(new FallbackStrategyOptions<HttpResponseMessage>()
{
FallbackAction = _ => Outcome.FromResultAsValueTask(new HttpResponseMessage(HttpStatusCode.ServiceUnavailable))
})
.AddConcurrencyLimiter(100)
.AddRetry(new HttpRetryStrategyOptions())
.AddCircuitBreaker(new HttpCircuitBreakerStrategyOptions())
.AddTimeout(new HttpTimeoutStrategyOptions());
});
We welcome feedback and contributions in our GitHub repo.