.Net Core HttpClientFactory para vários serviços API
Eu tenho um projeto .Net Core que precisa se conectar a cerca de 4 serviços de API diferentes, não sou especialista em nenhum código HttpClient, mas pelo que descobri, é que geralmente você só quer reutilizar uma instância do seu HttpClient. Pelo que posso dizer, o consenso geral é usar o HttpClientFactory no .Net Core, registrando-o em sua classe de inicialização e solicitando-o usando DI.
Agora, a maioria dos meus cabeçalhos padrão e outros são geralmente os mesmos além do URL BaseAddress, como devo fazer isso ao conectar a 4 serviços de API diff? Devo registrar 4 clientes nomeados diferentes ou ter um cliente com todas as informações padrão predefinidas e, em seguida, configurá-lo manualmente conforme necessário, por exemplo, configurar o endereço?
As perguntas gerais seriam, já que sou bastante novo nisso, dizem que reutiliza uma instância de um HttpClient.
- Se eu criar 4 clientes nomeados diferentes para cada serviço de API, isso não criaria 4 instâncias do HttpClient quando chamo o método .CreateClient ()?
- O .CreateClient () cria uma nova instância toda vez que é chamado, isso não anula o propósito de ter uma instância do HttpClient se, digamos, eu preciso fazer 3 chamadas diferentes para um serviço de API, cada uma dessas chamadas chamará a. CreateClient () para estabelecer algum tipo de conexão e isso irá criar 3 instâncias do HttpClient?
Qualquer ajuda para maior clareza seria apreciada,
Obrigado!
Respostas
O objetivo de usar IHttpClientFactorynão é reutilizar instâncias de HttpClient. Em vez disso, é para reutilizar (agrupando) instâncias de HttpMessageHandler(na verdade HttpClientHandler, que é derivado do abstrato HttpMessageHandler) que é o objeto subjacente que gerencia conexões e soquetes HTTP. Este diagrama do Microsoft Docs mostra isso bem.
Você estava preocupado com o fato de que chamadas frequentes para IHttpClientFactory.CreateClient()criariam o mesmo problema que chamadas frequentes para new HttpClient(). No entanto, este não é o caso. Conforme explicado pelos documentos da Microsoft , o motivo pelo qual chamadas frequentes para new HttpClient()resultam no esgotamento do soquete é que esse construtor criará uma nova instância de HttpMessageHandler:
No entanto, o problema não é realmente com HttpClient em si, mas com o construtor padrão para HttpClient, porque ele cria uma nova instância concreta de HttpMessageHandler, que é aquele que tem problemas de esgotamento de soquetes e alterações de DNS mencionados acima.
Você pode ver a partir do código-fonte de IHttpClientFactoryque ele não usa o construtor sem parâmetros de HttpClientno CreateClient(). Em vez disso, ele obtém o HttpMessageHandlerde um pool e o injeta no criado HttpClient.
Esteja você usando clientes digitados ou nomeados, você deve usar a instância HttpClient como se fosse um objeto transiente: é barato de criar e você não precisa armazená-lo em cache por longos períodos de tempo.