Dieser Artikel ist ein Spiegelartikel der maschinellen Übersetzung, bitte klicken Sie hier, um zum Originalartikel zu springen.

Ansehen: 9666|Antwort: 7

[Quelle] ASP.NET Core (XV) verwendet HttpClient, um HTTP-Anfragen zu senden

[Link kopieren]
Veröffentlicht am 14.05.2022 19:37:21 | | | |
Beim Erstellen einer Anwendung mit ASP.NET wird eine Instanz der HttpClient-Klasse verwendet, um eine HTTP-Anfrage zu stellen. Die Nutzung von HttpClient mag einfach erscheinen. Einige potenzielle Probleme werden jedoch erst bemerkt, wenn die Anwendung stark belastet ist.

Probleme im Zusammenhang mit der ursprünglichen HttpClient-Klasse in .NET:Der Hyperlink-Login ist sichtbar.

HttpClient ist bei der Implementierung von IDisposable keine bevorzugte Operation, es in der Using-Anweisung zu deklarieren und zu instanziieren, daBeim Freigeben eines HttpClient-Objekts tut der zugrundeliegende Socket dies nichtaugenblicklichloslassen, was Probleme mit der Erschöpfung der Fassung verursachen kann.

Das Problem liegt eigentlich nicht bei HttpClient selbst, sondern am Standard-Konstruktor von HttpClient, da es eine neue tatsächliche HttpMessageHandler-Instanz mit den oben genannten "Socket-Erschöpfung"- und DNS-Change-Problemen erstellt.



Direkte Erstellung von HttpClient (falsche Nutzung)

Instanziiert man das HttpClient-Objekt direkt und fügt man mit zur Garantie des Aufrufs der Dispose-Methode einen Aufruf hinzu, sieht der Code wie folgt aus:

Rufen Sie die Schnittstelle fünfmal an, senden Sie eine HTTP-Anfrage über HttpClient und überprüfen Sie die Netzwerkverbindung mit folgendem Befehl:

Man sieht, dass bei der Freigabe des HttpClient die Verbindung zwischen dem lokalen Computer und dem ZielserverTIME_WAITBei hoher Nebenläufigkeit wird der Fehler wie folgt gemeldet:

Keine Verbindung zum entfernten Server möglich
System.Net.Sockets.SocketException: Only one usage of each socket address (protocol/network address/port) is normally permitted.


Für Fragen können Sie auch nachsehen:

Eine falsche Nutzung von HttpClinet kann deine Software kaputt machen
https://www.itsvse.com/thread-10310-1-1.html
Erstellen Sie ein HttpClinet mit IHttpClientFactory (korrekte Verwendung)

Mit DI-Abhängigkeitsinjektion ist IHttpClientFactory dasselbe wie HttpLinet, das mit IHttpClientFactory erstellt wird.

Füge den Dienst der Startdatei hinzu, der Code lautet wie folgt:

Der HomeController-Controller-Code ist wie folgt:

Wir verwenden außerdem HttpClinet, um 5 Anfragen über die Anrufschnittstelle zu senden, und die Maschine stellt nur eine Verbindung mit dem Zielserver her, und die Verbindung wird während des Anfrageprozesses wiederverwendet. Wie unten gezeigt:



IHttpClientFactory sammelt fabrikerstellte HttpMessageHandler-Instanzen in einen Pool, um den Ressourcenverbrauch zu reduzieren. Wenn Sie eine neue HttpClient-Instanz erstellen, können Sie die HttpMessageHandler-Instanz im Pool wiederverwenden, sofern die Lebensdauer nicht abgelaufen ist.

{
    "Lebenszeit": "Singleton",
    "ServiceType": "System.Net.Http.IHttpClientFactory",
    "ImplementationType": "Microsoft.Extensions.Http.DefaultHttpClientFactory"
  },
  {
    "Lebenszeit": "Singleton",
    "ServiceType": "System.Net.Http.IHttpMessageHandlerFactory",
    "ImplementationType": "Microsoft.Extensions.Http.DefaultHttpClientFactory"
  }
IHttpClientFactory ist standardmäßig als DefaultHttpClientFactory implementiert, mit der Quellcodeadresse:Der Hyperlink-Login ist sichtbar.

Indem Sie IHttpClientFactory in einer DI-fähigen Anwendung verwenden, können Sie:

  • Lösen Sie das Problem der Ressourcenerschöpfung, indem Sie die HttpMessageHandler-Instanz teilen.
  • Lösen Sie die DNS-Stagnation, indem Sie regelmäßig durch HttpMessageHandler-Instanzen laufen.


Darüber hinaus gibt es weitere Möglichkeiten, die oben genannten Probleme mit langlebigen SocketsHttpHandler-Instanzen zu lösen.

  • Erstelle beim App-Start eine Instanz von SocketsHttpHandler und nutze sie während des gesamten Lebenszyklus der App.
  • Konfigurieren Sie PooledConnectionLifetime auf den entsprechenden Wert basierend auf der DNS-Aktualisierungszeit.
  • Erstellen Sie eine Instanz von HttpClient mit dem neuen HttpClient(handler, disposeHandler: false) bei Bedarf.


Der obige Ansatz löst Ressourcenmanagementprobleme ähnlich wie IHttpClientFactory.

  • SocketsHttpHandler zwischen den HttpClient-InstanzenGemeinsame Verbindungen。 Dieses Teilen verhindert die Erschöpfung der Sockel.
  • SocketsHttpHandler schließt Verbindungen basierend auf PooledConnectionLifetime, um DNS-Stagnation zu vermeiden.


Für weitere Nutzung und Konfiguration siehe bitte:

Der Hyperlink-Login ist sichtbar.
Der Hyperlink-Login ist sichtbar.





Vorhergehend:Eine falsche Nutzung von HttpClient kann Ihre Software kaputtmachen.
Nächster:jQuery Datatables Internationalisierungs-Plugin
 Vermieter| Veröffentlicht am 14.05.2022 19:38:14 |
Rezension

ASP.NET Core (vierzehn) basiert auf dem SkiaSharp-Bild-Captcha
https://www.itsvse.com/thread-10287-1-1.html

ASP.NET Core (XIII), um festzustellen, ob es sich um eine Ajax-Anfrage handelt oder nicht
https://www.itsvse.com/thread-10284-1-1.html

ASP.NET Core (zwölf) Frontend-JS, CSS-Bündelung und Kompression
https://www.itsvse.com/thread-10282-1-1.html

ASP.NET Core (XI) Endpunkt-Route fügt Middleware hinzu, um alle DI-Dienste anzuzeigen
https://www.itsvse.com/thread-10269-1-1.html

ASP.NET Detaillierte Erklärung der Konfigurationsprioritäten in Core(10).
https://www.itsvse.com/thread-10265-1-1.html

ASP.NET Detaillierte Erklärung der Middleware-Middleware von Core (9).
https://www.itsvse.com/thread-9647-1-1.html

ASP.NET Detaillierte Erklärung der Core Middleware
https://www.itsvse.com/thread-8126-1-1.html

ASP.NET Grube der Standardparameter der Swagger-Benutzeroberfläche in Core(8).
https://www.itsvse.com/thread-9640-1-1.html

ASP.NET Core (7) Tiefgehende Analyse des Framework-Quellcodes
https://www.itsvse.com/thread-9601-1-1.html

ASP.NET Core (VI) DI erhält manuell die Methode zum Einschleusen von Objekten
https://www.itsvse.com/thread-9595-1-1.html

ASP.NET Core (fünf) basiert auf CAP-verteilten Transaktionen
https://www.itsvse.com/thread-9593-1-1.html

ASP.NET Core(4)-Filter einheitliche ModelState-Modellvalidierung
https://www.itsvse.com/thread-9589-1-1.html

ASP.NET Core (iii) Erstellen Sie Instanzen dynamisch mit ActivatorUtilities
https://www.itsvse.com/thread-9488-1-1.html

ASP.NET Core (2) Die Anwendung per Code neu starten
https://www.itsvse.com/thread-9480-1-1.html

ASP.NET Core (1) verwendet Redis-Caching
https://www.itsvse.com/thread-9393-1-1.html
 Vermieter| Veröffentlicht am 14.05.2022 19:41:13 |
Veröffentlicht am 14.05.2022 22:36:06 |
Lerne es
Veröffentlicht am 19.05.2022 09:45:12 |
Hier kommt es, schau dir die Fortsetzung an
Veröffentlicht am 18.08.2022 16:13:45 |
Großartiges Lernen und Lernen
 Vermieter| Veröffentlicht am 24.06.2023 13:07:32 |
.NET/C# HttpClient-Quellcode-einfache Analyse
https://www.itsvse.com/thread-10617-1-1.html
 Vermieter| Veröffentlicht am 05.09.2024 14:35:55 |
Sehen Sie sich den Quellcode von HttpClientFactoryServiceCollectionCollectionExtensions an

Die Standardimplementierung von IHttpClientFactory istDefaultHttpClientFactory, wie in der untenstehenden Abbildung dargestellt:



Die CreateClient-Methode in DefaultHttpClientFactory instanziiert das HttpClient-ObjektdisposeHandler: false, wie in der untenstehenden Abbildung dargestellt:



Verzichtserklärung:
Alle von Code Farmer Network veröffentlichten Software, Programmiermaterialien oder Artikel dienen ausschließlich Lern- und Forschungszwecken; Die oben genannten Inhalte dürfen nicht für kommerzielle oder illegale Zwecke verwendet werden, andernfalls tragen die Nutzer alle Konsequenzen. Die Informationen auf dieser Seite stammen aus dem Internet, und Urheberrechtsstreitigkeiten haben nichts mit dieser Seite zu tun. Sie müssen die oben genannten Inhalte innerhalb von 24 Stunden nach dem Download vollständig von Ihrem Computer löschen. Wenn Ihnen das Programm gefällt, unterstützen Sie bitte echte Software, kaufen Sie die Registrierung und erhalten Sie bessere echte Dienstleistungen. Falls es eine Verletzung gibt, kontaktieren Sie uns bitte per E-Mail.

Mail To:help@itsvse.com