Есть сервис, который ходит во внешний API:
public sealed class PaymentApiClient
{
private readonly HttpClient _http;
public PaymentApiClient(HttpClient http)
{
_http = http;
}
public async Task<string> GetStatusAsync(string id, CancellationToken ct)
{
using var response = await _http.GetAsync($"/payments/{id}", ct);
response.EnsureSuccessStatusCode();
return await response.Content.ReadAsStringAsync(ct);
}
}
Регистрация:
builder.Services.AddHttpClient<PaymentApiClient>(client =>
{
client.BaseAddress = new Uri("https://payments.example.com");
client.Timeout = TimeSpan.FromSeconds(10);
})
.ConfigurePrimaryHttpMessageHandler(() => new SocketsHttpHandler
{
PooledConnectionLifetime = TimeSpan.FromMinutes(5),
MaxConnectionsPerServer = 50
});
Вопрос: почему это лучше, чем создавать
new HttpClient() на каждый запрос?Потому что
IHttpClientFactory переиспользует HttpMessageHandler и соединения под капотом. Это снижает риск socket exhaustion, даёт централизованную настройку таймаутов, ретраев, логирования и авторизации.А
PooledConnectionLifetime нужен, чтобы соединения не жили вечно и приложение могло корректно подхватывать изменения DNS.