.Net Core HttpClientFactory für mehrere API-Dienste

Sep 10 2020

Ich habe ein .Net Core-Projekt, das eine Verbindung zu ungefähr 4 verschiedenen API-Diensten herstellen muss. Ich bin kein Experte für den HttpClient-Code, aber ich habe festgestellt, dass Sie im Allgemeinen nur eine Instanz wiederverwenden möchten Ihres HttpClient. Nach allem, was ich sagen kann, besteht der allgemeine Konsens darin, die HttpClientFactory in .Net Core zu verwenden, indem Sie sie in Ihrer Startup-Klasse registrieren und dann mit DI anfordern.

Jetzt sind die meisten meiner Standardheader und solche außer der BaseAddress-URL im Allgemeinen gleich. Wie soll ich vorgehen, wenn ich eine Verbindung zu 4 verschiedenen API-Diensten herstelle? Sollte ich 4 Clients mit verschiedenen Namen registrieren oder einen Client mit allen voreingestellten Standardinformationen haben und diese dann manuell nach Bedarf konfigurieren, z. B. die Adresse konfigurieren?

Allgemeine Fragen wären, da ich ziemlich neu darin bin, es wurde gesagt, dass eine Instanz eines HttpClient wiederverwendet wird.

  1. Wenn ich für jeden API-Service 4 verschiedene benannte Clients erstelle, werden dann nicht 4 Instanzen des HttpClient erstellt, wenn ich die .CreateClient () -Methode aufrufe?
  2. Der .CreateClient () erstellt jedes Mal eine neue Instanz, wenn er aufgerufen wird. Dies beeinträchtigt nicht den Zweck, eine Instanz des HttpClient zu haben, wenn ich drei verschiedene Aufrufe an einen API-Dienst ausführen muss. CreateClient (), um eine Verbindung herzustellen und damit 3 Instanzen des HttpClient zu erstellen?

Jede Hilfe für Klarheit wäre dankbar,

Vielen Dank!

Antworten

2 scharnyw Sep 10 2020 at 14:01

Der Zweck der Verwendung IHttpClientFactorybesteht nicht darin, Instanzen von wiederzuverwenden HttpClient. Stattdessen werden Instanzen von HttpMessageHandler(tatsächlich HttpClientHandler, die aus der Zusammenfassung abgeleitet werden HttpMessageHandler) des zugrunde liegenden Objekts, das HTTP-Verbindungen und -Sockets verwaltet , wiederverwendet (durch Zusammenführen) . Dieses Diagramm aus Microsoft Docs zeigt es gut.

Sie befürchteten, dass häufige Anrufe bei IHttpClientFactory.CreateClient()das gleiche Problem verursachen wie häufige Anrufe bei new HttpClient(). Dies ist jedoch nicht der Fall. Wie in Microsoft-Dokumenten erläutert , führen häufige Aufrufe von zu einer new HttpClient()Erschöpfung des Sockets , weil dieser Konstruktor eine neue Instanz von Folgendem erstellt HttpMessageHandler:

Das Problem liegt jedoch nicht wirklich bei HttpClient an sich, sondern beim Standardkonstruktor für HttpClient, da eine neue konkrete Instanz von HttpMessageHandler erstellt wird, bei der Sockets erschöpft sind und DNS-Änderungen auftreten.

Sie können von dem sehen Quellcode von , IHttpClientFactorydass es nicht den parameterlosen Konstruktor von nicht verwendet HttpClientin CreateClient(). Stattdessen holt es das HttpMessageHandleraus einem Pool und injiziert es in das erstellte HttpClient.

Unabhängig davon, ob Sie typisierte oder benannte Clients verwenden, sollten Sie die HttpClient-Instanz so verwenden, als wäre sie ein vorübergehendes Objekt: Sie ist kostengünstig zu erstellen und muss nicht über einen längeren Zeitraum zwischengespeichert werden.