HttpClientwurde für die Wiederverwendung für mehrere Anrufe entwickelt . Auch über mehrere Threads hinweg. Das HttpClientHandlerverfügt über Anmeldeinformationen und Cookies, die für Anrufe wiederverwendet werden sollen. Um eine neue HttpClientInstanz zu haben, müssen Sie all diese Dinge neu einrichten. Außerdem DefaultRequestHeadersenthält die Eigenschaft Eigenschaften, die für mehrere Aufrufe vorgesehen sind. Wenn Sie diese Werte bei jeder Anforderung zurücksetzen müssen, wird der Punkt zunichte gemacht.
Ein weiterer großer Vorteil von HttpClient ist die Möglichkeit, HttpMessageHandlersdie Anforderungs- / Antwort-Pipeline zu erweitern, um Querschnittsthemen anzuwenden. Diese können zum Protokollieren, Überwachen, Drosseln, Umleiten, Offline-Behandeln und Erfassen von Metriken verwendet werden. Alle möglichen Dinge. Wenn für jede Anforderung ein neuer HttpClient erstellt wird, müssen alle diese Nachrichtenhandler für jede Anforderung eingerichtet werden, und es muss auch jeder Status auf Anwendungsebene bereitgestellt werden, der von Anforderungen für diese Handler gemeinsam genutzt wird.
Je mehr Sie die Funktionen von nutzen HttpClient , desto mehr werden Sie feststellen, dass die Wiederverwendung einer vorhandenen Instanz sinnvoll ist.
Das größte Problem ist jedoch meiner Meinung nach, dass eine HttpClientKlasse , wenn sie entsorgt wird HttpClientHandler, entsorgt , wodurch die TCP/IPVerbindung in dem von ihnen verwalteten Verbindungspool zwangsweise geschlossen wird ServicePointManager. Dies bedeutet, dass für jede Anforderung mit einer neuen HttpClienteine neue TCP/IPVerbindung wiederhergestellt werden muss .
Nach meinen Tests mit einfachem HTTP in einem LAN ist der Leistungseinbruch ziemlich vernachlässigbar. Ich vermute, dies liegt daran, dass ein zugrunde liegendes TCP-Keepalive die Verbindung offen hält, selbst wenn HttpClientHandlerversucht wird, sie zu schließen.
Auf Anfragen, die über das Internet gehen, habe ich eine andere Geschichte gesehen. Ich habe einen Leistungseinbruch von 40% festgestellt, weil ich die Anfrage jedes Mal neu öffnen musste.
Ich vermute, dass der Treffer bei einer HTTPSVerbindung noch schlimmer wäre.
Mein Rat ist , eine Instanz von HttpClient für die Lebensdauer Ihrer Anwendung für jede einzelne API, mit der Sie eine Verbindung herstellen, beizubehalten.
StopwatchKlasse zum Benchmarking verwenden können. Nach meiner Einschätzung ist es sinnvoller, eine einzige zu habenHttpClient, vorausgesetzt, alle diese Instanzen werden im selben Kontext verwendet.