Ereignisse
17. März, 21 Uhr - 21. März, 10 Uhr
Nehmen Sie an der Meetup-Serie teil, um skalierbare KI-Lösungen basierend auf realen Anwendungsfällen mit Mitentwicklern und Experten zu erstellen.
Jetzt registrierenDieser Browser wird nicht mehr unterstützt.
Führen Sie ein Upgrade auf Microsoft Edge aus, um die neuesten Funktionen, Sicherheitsupdates und technischen Support zu nutzen.
Die System.Net.Http.HttpClient-Klasse sendet HTTP-Anforderungen und empfängt HTTP-Antworten von einer Ressource, die durch einen URI identifiziert wird. Eine HttpClient-Instanz ist eine Sammlung von Einstellungen, die auf alle von dieser Instanz ausgeführten Anforderungen angewendet wird, und jede Instanz verwendet einen eigenen Verbindungspool, der ihre Anforderungen von anderen isoliert. Ab .NET Core 2.1 stellt die SocketsHttpHandler-Klasse die Implementierung bereit, sodass das Verhalten auf allen Plattformen konsistent ist.
HttpClient löst DNS-Einträge nur auf, wenn eine Verbindung erstellt wird. Die vom DNS-Server angegebene Gültigkeitsdauer (Time To Live, TTL) wird nicht nachverfolgt. Wenn sich DNS-Einträge regelmäßig ändern, was in einigen Szenarien vorkommen kann, berücksichtigt der Client diese Updates nicht. Um dieses Problem zu beheben, können Sie die Gültigkeitsdauer der Verbindung einschränken, indem Sie die PooledConnectionLifetime-Eigenschaft festlegen, sodass die DNS-Suche wiederholt wird, wenn die Verbindung ersetzt wird. Betrachten Sie das folgenden Beispiel:
var handler = new SocketsHttpHandler
{
PooledConnectionLifetime = TimeSpan.FromMinutes(15) // Recreate every 15 minutes
};
var sharedClient = new HttpClient(handler);
Der vorherige HttpClient
ist so konfiguriert, dass Verbindungen 15 Minuten lang wiederverwendet werden. Nach Ablauf des von PooledConnectionLifetime angegebenen Zeitintervalls und nachdem die Verbindung die letzte zugehörige Anforderung (falls vorhanden) abgeschlossen hat, wird diese Verbindung geschlossen. Wenn es Anforderungen gibt, die in der Warteschlange warten, wird nach Bedarf eine neue Verbindung erstellt.
Das 15-Minuten-Intervall wurde willkürlich zur Veranschaulichung gewählt. Sie sollten den Wert basierend auf der erwarteten Häufigkeit von DNS- oder anderen Netzwerkänderungen auswählen.
Der Verbindungspool für einen HttpClient ist mit dem zugrunde liegenden SocketsHttpHandler verknüpft. Wenn die HttpClient-Instanz verworfen wird, werden alle vorhandenen Verbindungen innerhalb des Pools verworfen. Wenn Sie später eine Anforderung an denselben Server senden, muss eine neue Verbindung erstellt werden. Daher gibt es eine Leistungsstrafe für die unnötige Verbindungserstellung. Darüber hinaus werden TCP-Ports nicht sofort nach dem Schließen der Verbindung freigegeben. (Weitere Informationen hierzu finden Sie unter „TCP TIME-WAIT
“ in RFC 9293.) Bei hoher Anforderungsrate ist das Betriebssystemlimit der verfügbaren Ports möglicherweise erschöpft. Um Porterschöpfungsprobleme zu vermeiden, wird empfohlen, HttpClient-Instanzen für möglichst viele HTTP-Anforderungen wiederzuverwenden.
Als Zusammenfassung der empfohlenen HttpClient
-Verwendung in Bezug auf die Lebensdauerverwaltung sollten Sie entweder langlebige Clients mit eingerichteter PooledConnectionLifetime
(.NET Core und .NET 5 oder höher) verwenden oder kurzlebige Clients, die von IHttpClientFactory
erstellt werden.
In .NET Core und .NET 5 oder höher:
static
-Instanz vom Typ oder HttpClient, wobei PooledConnectionLifetime auf das gewünschte Intervall festgelegt ist, z. B. 2 Minuten, je nach erwarteten DNS-Änderungen. Dadurch werden sowohl die Probleme mit Porterschöpfung als auch bei DNS-Änderungen behoben, ohne den Mehraufwand von IHttpClientFactory hinzuzufügen. Wenn Sie In der Lage sein müssen, Ihren Handler zu simulieren, können Sie ihn separat registrieren.Tipp
Wenn Sie nur eine begrenzte Anzahl von HttpClient-Instanzen verwenden, ist dies ebenfalls eine akzeptable Strategie. Es kommt darauf an, dass sie nicht mit jeder Anforderung erstellt und verworfen werden, da sie jeweils einen Verbindungspool enthalten. Die Verwendung mehrerer Instanzen ist für Szenarien mit mehreren Proxys oder zum Trennen von Cookiecontainern erforderlich, ohne die Cookieverarbeitung vollständig zu deaktivieren.
Mit IHttpClientFactory können Sie mehrere, unterschiedlich konfigurierte Clients für unterschiedliche Anwendungsfälle verwenden. Beachten Sie jedoch, dass die von der Factory erstellten Clients kurzlebig sein sollen, und sobald der Client erstellt wurde, besitzt die Factory keine Kontrolle mehr darüber.
Die Factory poolt HttpMessageHandler-Instanzen, und wenn seine Gültigkeitsdauer noch nicht abgelaufen ist, kann ein Handler aus dem Pool wiederverwendet werden, wenn die Factory eine neue HttpClient-Instanz erstellt. Durch diese Wiederverwendung werden Probleme mit Socketerschöpfung vermieden.
Wenn Sie die Konfigurierbarkeit wünschen, die IHttpClientFactory bereitstellt, wird empfohlen, den Ansatz mit typisierten Clients zu verwenden.
Verwenden Sie in .NET Framework IHttpClientFactory, um Ihre HttpClient
-Instanzen zu verwalten. Wenn Sie die Factory nicht verwenden und stattdessen für jede Anforderung selbst eine neue Clientinstanz erstellen, können Sie die verfügbaren Ports erschöpfen.
Tipp
Wenn Ihre App Cookies erfordert, sollten Sie ggf. automatische Cookieverarbeitung deaktivieren oder IHttpClientFactory vermeiden. Das Poolen der HttpMessageHandler-Instanzen führt zur Freigabe von CookieContainer-Objekten. Die unerwartete Freigabe von CookieContainer-Objekten führt oft zu fehlerhaftem Code.
Weitere Informationen zum Verwalten der HttpClient
-Lebensdauer mit IHttpClientFactory
finden Sie unter IHttpClientFactory
-Richtlinien.
Es ist mithilfe des folgenden Musters möglich, einen static
- oder Singleton-Client so zu konfigurieren, dass eine beliebige Anzahl von Resilienzpipelines verwendet wird:
using System;
using System.Net.Http;
using Microsoft.Extensions.Http;
using Microsoft.Extensions.Http.Resilience;
using Polly;
var retryPipeline = new ResiliencePipelineBuilder<HttpResponseMessage>()
.AddRetry(new HttpRetryStrategyOptions
{
BackoffType = DelayBackoffType.Exponential,
MaxRetryAttempts = 3
})
.Build();
var socketHandler = new SocketsHttpHandler
{
PooledConnectionLifetime = TimeSpan.FromMinutes(15)
};
var resilienceHandler = new ResilienceHandler(retryPipeline)
{
InnerHandler = socketHandler,
};
var httpClient = new HttpClient(resilienceHandler);
Der vorangehende Code:
socketHandler
.socketHandler
mit der Wiederholungslogik an resilienceHandler
.HttpClient
mit resilienceHandler
.Wichtig
Die Microsoft.Extensions.Http.Resilience
Bibliothek ist derzeit als experimentell gekennzeichnet und kann sich in Zukunft ändern.
Feedback zu .NET
.NET ist ein Open Source-Projekt. Wählen Sie einen Link aus, um Feedback zu geben:
Ereignisse
17. März, 21 Uhr - 21. März, 10 Uhr
Nehmen Sie an der Meetup-Serie teil, um skalierbare KI-Lösungen basierend auf realen Anwendungsfällen mit Mitentwicklern und Experten zu erstellen.
Jetzt registrierenSchulung
Modul
REST-Webdienste in .NET MAUI-Anwendungen nutzen - Training
Nutzen eines REST-Webdiensts mithilfe von HttpClient und Ausführen grundlegender CRUD-Vorgänge. Sie werden erkennen, wann Ihr Gerät mit dem Internet verbunden ist, um eine gute Benutzererfahrung zu bieten, und Sie können die Vorteile der nativen Netztechnologiestapel nutzen, um Spitzenleistungen zu erzielen.
Dokumentation
Verwenden von IHttpClientFactory - .NET
Erfahren Sie, wie Sie die HttpClient- und IHttpClientFactory-Implementierungen mit Abhängigkeitsinjektion in Ihren .NET-Workloads verwenden können.
Behandeln von Problemen mit IHttpClientFactory - .NET
Erfahren Sie, wie Sie allgemeine HttpClient- und IHttpClientFactory-Probleme beheben.
Verwenden von IHttpClientFactory zum Implementieren widerstandsfähiger HTTP-Anforderungen - .NET
Erfahren Sie, wie Sie IHttpClientFactory verwenden, die seit .NET Core 2.1 zum Erstellen von 'HttpClient'-Instanzen verfügbar sind, wodurch sie für Sie in Ihren Anwendungen einfach verwendet werden können.
System.Net.Http.HttpClient-Klasse - .NET
Erfahren Sie mehr über die System.Net.Http.HttpClient-Klasse.