Ist die gleichzeitige Verwendung von HttpClient sicher?

151

In allen Beispielen, deren Verwendung ich finden kann HttpClient, wird es für einmalige Anrufe verwendet. Was aber, wenn ich eine anhaltende Client-Situation habe, in der mehrere Anfragen gleichzeitig gestellt werden können? Grundsätzlich ist es sicher, client.PostAsync2 Threads gleichzeitig gegen dieselbe Instanz von aufzurufen HttpClient.

Ich suche hier nicht wirklich nach experimentellen Ergebnissen. Ein funktionierendes Beispiel könnte einfach ein Zufall sein (und noch dazu ein hartnäckiger), und ein fehlgeschlagenes Beispiel kann ein Fehlkonfigurationsproblem sein. Im Idealfall suche ich nach einer maßgeblichen Antwort auf die Frage der Parallelitätsbehandlung in HttpClient.

Alex K.
quelle
2
Lesen Sie auch diese Frage für weitere Informationen zur ordnungsgemäßen Verwendung HttpClientund Entsorgung: stackoverflow.com/questions/15705092/…
Mani Gandham

Antworten:

152

Laut MSDN seit .NET 4.5 Die folgenden Instanzmethoden sind threadsicher (danke @ischell):

CancelPendingRequests
DeleteAsync
GetAsync
GetByteArrayAsync
GetStreamAsync
GetStringAsync
PostAsync
PutAsync
SendAsync
Marcel N.
quelle
3
Ja, da war ich mir nicht sicher, da es sich anscheinend um eine Standardwarnung für alles auf MSDN handelt (und ich erinnere mich, dass ich einige MSDN-Blogs darüber gelesen habe, wie manchmal diese Warnung falsch ist, da sie blind auf alles angewendet wird).
Alex K
3
Das ist falsch; Im Abschnitt "Anmerkungen" der von Ihnen verlinkten MSDN-Seite heißt es, dass GetAsync, PostAsync usw. alle threadsicher sind.
Ischell
4
@ischell: Ich kann Ihnen versichern , dass der fraglichen Absatz nicht war zu der Zeit dort dieses Thema diskutiert wurde.
Marcel N.
7
Microsoft hat HttpClient so konzipiert, dass es wiederverwendbar ist, aber dann verfügt die Klasse über Instanzdaten für Header: client.DefaultRequestHeaders.Accept.Add (...);
Cwills
8
Spät, aber ich wollte @cwills kommentieren. DefaultRequestHeaders sind genau das, Standardeinstellungen. Wenn Sie pro Anforderung unterschiedliche Header wünschen, können Sie einen neuen StringContent () erstellen, zusätzliche Header festlegen und dann die Überladung verwenden, die URI und HttpContent benötigt.
Ryan Anderson
92

Hier ist ein weiterer Artikel von Henrik F. Nielsen über HttpClient, in dem er sagt:

" Der Standard-HttpClient ist die einfachste Methode, mit der Sie mit dem Senden von Anforderungen beginnen können. Mit einem einzelnen HttpClient können so viele HTTP-Anforderungen gleichzeitig gesendet werden, wie Sie möchten. In vielen Szenarien können Sie also nur einen HttpClient erstellen und diesen dann für alle Ihre Anforderungen verwenden . "

Muruge
quelle
13
Was ist, wenn sich Benutzername und Passwort zwischen den Threads ändern können? Das ist es, worüber ich anscheinend niemanden sprechen kann
Nicholas DiPiazza
1
@NicholasDiPiazza: Wie oft ändert es sich? Wenn ein bekannter Satz von Benutzer / Kennwort-Paaren bekannt ist, können Sie einen Pool von HttpClient-Instanzen erstellen.
Marcel N.
Ja, das habe ich letztendlich getan
Nicholas DiPiazza
2
Beachten Sie, dass die Wiederverwendung desselben HttpClient für alle Ihre Anforderungen zu veralteten DNS-Problemen führen kann: github.com/dotnet/corefx/issues/11224 .
Ohad Schneider
1
@OhadSchneider Wenn Sie glauben, dass das Problem auf den .net-Kern beschränkt ist. Sie können das Problem mit .net 4 beheben, indem Sie einen benutzerdefinierten HttpClientHandler in den HttpClient-Konstruktor einfügen und dann "ConnectionLeaseTimeout" festlegen. Wenn jedoch 100 Sekunden lang keine Anforderungen an den Endpunkt gesendet werden, wird die Verbindung von selbst aktualisiert. geschützte Überschreibung Task <HttpResponseMessage> SendAsync (HttpRequestMessage-Anforderung, CancellationToken CancellationToken) {var sp = ServicePointManager.FindServicePoint (request.RequestUri); sp.ConnectionLeaseTimeout = 100 * 1000; }
Timothy Gonzalez
17

Habe einen MSDN-Forumsbeitrag von Henrik F. Nielsen (einem der Hauptarchitekten von HttpClient) gefunden.

Kurze Zusammenfassung:

  • Wenn Sie Anforderungen haben, die miteinander zusammenhängen (oder nicht aufeinander treten), ist die Verwendung desselben HttpClient sehr sinnvoll.
  • Im Allgemeinen würde ich empfehlen, HttpClient-Instanzen so oft wie möglich wiederzuverwenden.
Alex K.
quelle