HttpClientfoi projetado para ser reutilizado para várias chamadas . Mesmo em vários segmentos. O HttpClientHandlercredenciais e Cookies que se destinam a ser entre as chamadas reutilizado. Ter uma nova HttpClientinstância requer a restauração de todas essas coisas. Além disso, a DefaultRequestHeaderspropriedade contém propriedades destinadas a várias chamadas. Ter que redefinir esses valores em cada solicitação anula o ponto.
Outro grande benefício HttpClienté a capacidade de adicionar HttpMessageHandlersao pipeline de solicitação / resposta para aplicar preocupações transversais. Estes podem ser para registro, auditoria, limitação, manipulação de redirecionamento, manipulação offline, captura de métricas. Todos os tipos de coisas diferentes. Se um novo HttpClient for criado em cada solicitação, todos esses manipuladores de mensagens precisarão ser configurados em cada solicitação e, de alguma forma, qualquer estado de nível de aplicativo compartilhado entre solicitações para esses manipuladores também precisará ser fornecido.
Quanto mais você usar os recursos HttpClient, mais verá que reutilizar uma instância existente faz sentido.
No entanto, o maior problema, na minha opinião, é que, quando uma HttpClientclasse é descartada, ela é descartada, o HttpClientHandlerque fecha forçosamente a TCP/IPconexão no pool de conexões gerenciadas por ServicePointManager. Isso significa que cada solicitação com uma nova HttpClientrequer o restabelecimento de uma nova TCP/IPconexão.
Nos meus testes, usando HTTP simples em uma LAN, o impacto no desempenho é bastante insignificante. Suspeito que isso ocorra porque existe um keepalive TCP subjacente que mantém a conexão aberta mesmo quando HttpClientHandlertenta fechá-la.
Em solicitações que passam pela Internet, eu vi uma história diferente. Vi um impacto de 40% no desempenho devido à necessidade de reabrir a solicitação todas as vezes.
Eu suspeito que o golpe em uma HTTPSconexão seria ainda pior.
Meu conselho é manter uma instância do HttpClient durante a vida útil do seu aplicativo para cada API distinta à qual você se conecta.
Stopwatchclasse para compará-la, no entanto. Minha estimativa seria que faz mais sentido ter um únicoHttpClient, supondo que todas essas instâncias sejam usadas no mesmo contexto.