HttpClient
wurde für die Wiederverwendung für mehrere Anrufe entwickelt . Auch über mehrere Threads hinweg. Das HttpClientHandler
verfügt über Anmeldeinformationen und Cookies, die für Anrufe wiederverwendet werden sollen. Um eine neue HttpClient
Instanz zu haben, müssen Sie all diese Dinge neu einrichten. Außerdem DefaultRequestHeaders
enthä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, HttpMessageHandlers
die 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 HttpClient
Klasse , wenn sie entsorgt wird HttpClientHandler
, entsorgt , wodurch die TCP/IP
Verbindung in dem von ihnen verwalteten Verbindungspool zwangsweise geschlossen wird ServicePointManager
. Dies bedeutet, dass für jede Anforderung mit einer neuen HttpClient
eine neue TCP/IP
Verbindung 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 HttpClientHandler
versucht 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 HTTPS
Verbindung 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.
Stopwatch
Klasse 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.