Skip to content

Commit

Permalink
Update the section on resilience and static clients (#39010)
Browse files Browse the repository at this point in the history
* Update the section on resilience and static clients

* Update httpclient-guidelines.md

* Update httpclient-guidelines.md
  • Loading branch information
martintmk committed Jan 10, 2024
1 parent 8f9fe64 commit d3a0d50
Showing 1 changed file with 16 additions and 12 deletions.
28 changes: 16 additions & 12 deletions docs/fundamentals/networking/http/httpclient-guidelines.md
Original file line number Diff line number Diff line change
Expand Up @@ -52,37 +52,41 @@ To summarize recommended `HttpClient` use in terms of lifetime management, you s
For more information about managing `HttpClient` lifetime with `IHttpClientFactory`, see [`IHttpClientFactory` guidelines](../../../core/extensions/httpclient-factory.md#httpclient-lifetime-management).

## Resilience policies with static clients
## Resilience with static clients

It's possible to configure a `static` or *singleton* client to use any number of resilience policies using the following pattern:
It's possible to configure a `static` or *singleton* client to use any number of resilience pipelines using the following pattern:

```csharp
using System;
using System.Net.Http;
using Microsoft.Extensions.Http;
using Microsoft.Extensions.Http.Resilience;
using Polly;
using Polly.Extensions.Http;

var retryPolicy = HttpPolicyExtensions
.HandleTransientHttpError()
.WaitAndRetryAsync(3, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)));
var retryPipeline = new ResiliencePipelineBuilder<HttpResponseMessage>()
.AddRetry(new HttpRetryStrategyOptions
{
BackoffType = DelayBackoffType.Exponential,
MaxRetryAttempts = 3
})
.Build();

var socketHandler = new SocketsHttpHandler { PooledConnectionLifetime = TimeSpan.FromMinutes(15) };
var pollyHandler = new PolicyHttpMessageHandler(retryPolicy)
var resilienceHandler = new ResilienceHandler(retryPipeline)
{
InnerHandler = socketHandler,
};

var httpClient = new HttpClient(pollyHandler);
var httpClient = new HttpClient(resilienceHandler);
```

The preceding code:

- Relies on [Microsoft.Extensions.Http.Polly](https://www.nuget.org/packages/Microsoft.Extensions.Http.Polly) NuGet package, transitively the [Polly.Extensions.Http](https://www.nuget.org/packages/Polly.Extensions.Http) NuGet package for the `HttpPolicyExtensions` type.
- Specifies a transient HTTP error handler, configured with retry policy that with each attempt will exponentially backoff delay intervals.
- Relies on [Microsoft.Extensions.Http.Resilience](https://www.nuget.org/packages/Microsoft.Extensions.Http.Resilience) NuGet package.
- Specifies a transient HTTP error handler, configured with retry pipeline that with each attempt will exponentially backoff delay intervals.
- Defines a pooled connection lifetime of fifteen minutes for the `socketHandler`.
- Passes the `socketHandler` to the `policyHandler` with the retry logic.
- Instantiates an `HttpClient` given the `policyHandler`.
- Passes the `socketHandler` to the `resilienceHandler` with the retry logic.
- Instantiates an `HttpClient` given the `resilienceHandler`.

## See also

Expand Down

0 comments on commit d3a0d50

Please sign in to comment.