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?