HttpClient eine einzige Instanz mit verschiedenen Authentifizierungs-Header
Gegeben, dass die .Netto-HttpClient wurde mit Wiederverwendung im Auge und soll lange lebte und memory leaks gemeldet wurden in kurzlebigen Instanzen. Was Hilfslinien sind da, wo Sie wollen, um restful-Aufrufe zu einem bestimmten Endpunkt mit verschiedenen bearer-Token (oder irgendein authorization-header) beim Aufruf der Endpunkt für mehrere Benutzer?
private void CallEndpoint(string resourceId, string bearerToken) {
httpClient.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("bearer", bearerToken);
var response = await httpClient.GetAsync($"resource/{resourceid}");
}
Angesichts der obige code aufgerufen werden könnte von einer beliebigen Anzahl von threads, die auf eine web-Anwendung ist es leicht möglich, dass die header-Satz in der ersten Zeile ist nicht das gleiche, das beim Aufruf der Ressource.
Ohne dass Konflikte mit sperren und Aufrechterhaltung einer stateless web-Anwendung, was ist die empfohlene Vorgehensweise zum erstellen und Entsorgung HttpClients für einen einzelnen Endpunkt (Meine aktuellen Praxis ist die Schaffung eines einheitlichen client pro Endpunkt)?
Lifecycle
Obwohl HttpClient hat indirekt die IDisposable implementieren
Schnittstelle, ist die empfohlene Verwendung der HttpClient ist nicht, Sie zu entsorgen
nach jeder Anfrage. Das HttpClient-Objekt bestimmt ist, so zu Leben, wie
lange, wie Sie Ihre Anwendung braucht, um HTTP-Anfragen. Ein Objekt haben
bestehen über mehrere Anfragen hinweg ermöglicht, einen Platz für die Einstellung
DefaultRequestHeaders und verhindert, dass Dinge neu einzugeben
wie CredentialCache-und CookieContainer bei jeder Anfrage, als war
notwendig mit HttpWebRequest.
Es wäre eine einzigartige header für jeden Benutzer. Es wäre, dass der Nutzer den oauth-token. Ich denke, dass scott hannen hat mich auf die richtige Spur. Sieht aus wie eine Erweiterung Methoden wird in Ordnung sein.
Hallo @Bronumski , können Sie teilen sich die Art und Weise Sie diese gelöst? Ich habe das gleiche Problem mit mehreren threads hinzufügen der gleiche Kopf, aber mit unterschiedlichen Inhalten.
Ich habe aktualisiert scotts Antwort mit Beispielen, wie ich die GET und POST. Das gleiche Prinzip wird verwendet, auf eine der anderen Methoden, die Sie implementieren möchten. Die extension-Methode enthält eine Aktion, die ermöglicht es Ihnen, zu manipulieren, das HttpRequest, bevor es gesendet wird.
Danke für die Antwort... scheint, wie ich gehe einen ähnlichen Weg, die Nutzung von sendasync und übergeben eine Anfrage als parameter mit dem custom-Header.
InformationsquelleAutor Bronumski | 2016-06-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Ihr Header sind in der Regel die gleiche dann können Sie die
DefaultRequestHeaders
. Aber Sie brauchen nicht zu verwenden, die die Eigenschaft angeben, den Header. Wie Sie festgestellt haben, das würde auch gar nicht funktionieren, wenn du gehst, um mehrere threads mit dem gleichen client. Änderungen an den Standard-Header gemacht, in einem thread wirkt sich auf Anfragen in anderen threads.Allerdings können Sie die Standard-Header an den client, und wenden Sie Sie auf jede Anforderung, die Header sind wirklich Eigenschaften der Anfrage. Also, wenn die Header einer Anfrage, Sie möchte nur hinzufügen, dass Sie den Wunsch.
Das bedeutet, dass Sie nicht verwenden können, die vereinfachten Verfahren, die nicht um die Erstellung einer
HttpRequest
. Benötigen Siedokumentiert hier.
Beispiel der GET-und POST-Methoden erfolgt über eine extension-Methode, können Sie Sie Bearbeiten den request-header und mehr von der
HttpRequestMessage
bevor es gesendet wird:Diese könnten dann wie folgt benutzt werden:
Was
HttpClientHandler.Proxy
,HttpClientHandler.CookieContainer
und andere EigenschaftenHttpClientHandler
dass kann nicht festgelegt werden, in derHttpRequestMessage
? (oder können Sie?)InformationsquelleAutor Scott Hannen