Em um post anterior, tratamos sobre como usar e como não usar o HttpClient em .NET. Entretanto, não mencionamos uma abordagem mais recente, proposta pela própria Microsoft: HttpClientFactory.
NOTA: Há um excelente post sobre HttpClientFactory, da Microsoft, indicando as vantagens, com diversos exemplos explorando suas features.
Recomendamos muito a leitura do post da Microsoft por aprofundar o que mostramos aqui, com cenários além deste que estamos abordando.
Problema ao manter HttpClient em um Singleton
Uma instância de HttpClient, preservada em um singleton, mantém conexões e não respeita o TTL do DNS. Assim, nunca são atualizadas.
Suponha que você esteja consumindo um serviço que pode ter seu IP mudado, por exemplo um IP dinâmico, você passará a ter problemas e certamente o serviço deixará de responder.
HttpClientFactory
A classe HttpClientFactory, que implementa a interface IHttpClientFactory resolve os problemas que indicamos em HttpClient que indicamos no post anterior. Ou seja, ela gerencia adequadamente as instâncias do HttpClient fazendo a “coisa certa”.
Com HttpClientFactory, é possível determinar um “tempo de vida” para cada instância de HttpClient fazendo com que o problema que destacamos acima seja mitigado.
var serviceCollection = new ServiceCollection();
serviceCollection
.AddHttpClient("eximia")
.SetHandlerLifetime(TimeSpan.FromMinutes(5));
var serviceProvider = serviceCollection.BuildServiceProvider();
HttpClientFactory, idealmente, terá sua instância injetada.
Obter um client utilizando CreateClient de IHttpClientFactory, cria uma nova instância de HttpClient, se for necessário. Afinal, internamente, HttpClientFactory mantém pools para reaproveitamento, reduzindo o consumo de recursos, como sockets.
A imagem abaixa, extraída do post que recomendamos, mostra como a Microsoft explica HttpClientFactory

O vídeo abaixo mostra o resultado do código acima e podemos perceber como o HttpClientFactory gerencia corretamente os sockets.
A performance do HttpClientFactory comparada com HttpClient usando BenchmarkDotNet
Impossível não reconhecer as melhorias de performance que o HttpClientFactory trouxe no .NET Core.

Impressionante a diferença na performance! Obrigado por compartilhar os resultados. Fiquei curioso sobre como foi feita a implementação desse benchmark. É possível ter acesso ao código?