HttpClient
a été conçu pour être réutilisé pour plusieurs appels . Même sur plusieurs threads. Le HttpClientHandler
a des informations d'identification et des cookies qui sont destinés à être réutilisés lors d'appels. Avoir une nouvelle HttpClient
instance nécessite de reconfigurer tout cela. En outre, la DefaultRequestHeaders
propriété contient des propriétés destinées à plusieurs appels. Le fait de devoir réinitialiser ces valeurs à chaque demande annule le point.
Un autre avantage majeur de HttpClient
est la possibilité d'ajouter HttpMessageHandlers
dans le pipeline de demandes / réponses pour appliquer des préoccupations transversales. Il peut s'agir de la journalisation, de l'audit, de la limitation, de la gestion des redirections, de la gestion hors ligne, de la capture de métriques. Toutes sortes de choses différentes. Si un nouveau HttpClient est créé à chaque demande, tous ces gestionnaires de messages doivent être configurés à chaque demande et, d'une manière ou d'une autre, tout état au niveau de l'application qui est partagé entre les demandes de ces gestionnaires doit également être fourni.
Plus vous utilisez les fonctionnalités de HttpClient
, plus vous verrez que la réutilisation d'une instance existante a du sens.
Cependant, le plus gros problème, à mon avis, est que lorsqu'une HttpClient
classe est supprimée, elle dispose HttpClientHandler
, ce qui ferme ensuite de force la TCP/IP
connexion dans le pool de connexions géré par ServicePointManager
. Cela signifie que chaque demande avec un nouveau HttpClient
nécessite le rétablissement d'une nouvelle TCP/IP
connexion.
D'après mes tests, en utilisant HTTP simple sur un réseau local, le succès des performances est assez négligeable. Je soupçonne que c'est parce qu'il existe un keepalive TCP sous-jacent qui maintient la connexion ouverte même lorsque vous HttpClientHandler
essayez de la fermer.
Sur les demandes qui vont sur Internet, j'ai vu une histoire différente. J'ai vu une baisse de performance de 40% en raison de la nécessité de rouvrir la demande à chaque fois.
Je soupçonne que le coup sur une HTTPS
connexion serait encore pire.
Mon conseil est de conserver une instance de HttpClient pour la durée de vie de votre application pour chaque API distincte à laquelle vous vous connectez.
Stopwatch
classe pour la comparer. Mon estimation serait qu'il serait plus logique d'en avoir un seulHttpClient
, en supposant que toutes ces instances sont utilisées dans le même contexte.