HttpClient
foi projetado para ser reutilizado para várias chamadas . Mesmo em vários segmentos. O HttpClientHandler
credenciais e Cookies que se destinam a ser entre as chamadas reutilizado. Ter uma nova HttpClient
instância requer a restauração de todas essas coisas. Além disso, a DefaultRequestHeaders
propriedade 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 HttpMessageHandlers
ao 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 HttpClient
classe é descartada, ela é descartada, o HttpClientHandler
que fecha forçosamente a TCP/IP
conexão no pool de conexões gerenciadas por ServicePointManager
. Isso significa que cada solicitação com uma nova HttpClient
requer o restabelecimento de uma nova TCP/IP
conexã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 HttpClientHandler
tenta 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 HTTPS
conexã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.
Stopwatch
classe 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.