Polly with .NET 6, Part 4 - Dependency Injection of a HttpClientFactory and Policy into a Minimal API Endpoint
Download full source code.
Want to learn more about Polly? Check out my Pluralsight course on it.
If you are using .NET 6 with the traditional Startup.cs
and Program.cs
, you don’t need to change anything about how you are using Polly. It all works the same.
But if you are using the new “top-level” statements and minimal API, it’s all very different.
Add Package and Using
Add the Polly NuGet package to you project -
dotnet add package Polly
In Program.cs
add a using statement at the top -
using Polly;
HttpClientFactory, Policy and DI container
Create the HttpClientFactory
with a retry policy, and add it to the service collection -
builder.Services.AddHttpClient("InventoryApi", client =>
{
client.BaseAddress = new Uri("http://localhost:5000/");
client.DefaultRequestHeaders.Add("Accept", "application/json");
}).AddPolicyHandler(Policy.HandleResult<HttpResponseMessage>
(r => !r.IsSuccessStatusCode).RetryAsync(3));
var app = builder.Build();
Endpoints and DI
Create an endpoint that returns errors 75% of the time -
1int _requestCount = 0;
2
3app.MapGet("/Inventory/{id}", (int id) =>
4{
5 _requestCount++;
6
7 if (_requestCount % 4 == 0) // only one of out four requests will succeed
8 {
9 System.Console.WriteLine($"{_requestCount} It worked!");
10 return Results.Ok(15);
11 }
12
13 System.Console.WriteLine($"{_requestCount} Something went wrong");
14 return Results.Problem("Something went wrong");
15});
Add an endpoint that takes the HttpClientFactory
by DI -
1app.MapGet("/Catalog/{id}", async (int id, IHttpClientFactory httpClientFactory) =>
2{
3 var httpClient = httpClientFactory.CreateClient("InventoryApi");
4
5 string requestEndpoint = $"Inventory/{id}";
6
7 HttpResponseMessage response = await httpClient.GetAsync(requestEndpoint);
8
9 if (response.IsSuccessStatusCode)
10 {
11 int itemsInStock = await response.Content.ReadFromJsonAsync<int>();
12 return Results.Ok(itemsInStock);
13 }
14 return Results.Problem("Something went wrong");
15
16});
Start the application, and hit http://localhost:5000/catalog/1
. You will see console statements showing the retries.
That’s it!
Download full source code.