Betrachten Sie den folgenden Code, in dem BaseAddress
der einen partiellen URI-Pfad definiert.
using (var handler = new HttpClientHandler())
using (var client = new HttpClient(handler))
{
client.BaseAddress = new Uri("http://something.com/api");
var response = await client.GetAsync("/resource/7");
}
Ich erwarte, dass dies eine GET
Anfrage an http://something.com/api/resource/7
. Aber das tut es nicht.
Nach einigem Suchen finde ich diese Frage und Antwort: HttpClient mit BaseAddress . Der Vorschlag ist, /
am Ende des zu platzieren BaseAddress
.
using (var handler = new HttpClientHandler())
using (var client = new HttpClient(handler))
{
client.BaseAddress = new Uri("http://something.com/api/");
var response = await client.GetAsync("/resource/7");
}
Es funktioniert immer noch nicht. Hier ist die Dokumentation: HttpClient.BaseAddress Was ist hier los?
c#
.net
dotnet-httpclient
Timothy Shields
quelle
quelle
Antworten:
Es stellt sich heraus, dass von den vier möglichen Permutationen des Einschlusses oder Ausschlusses von nachgestellten oder führenden Schrägstrichen auf dem
BaseAddress
und dem relativen URI, der an dieGetAsync
Methode übergeben wird - oder welcher anderen Methode auch immerHttpClient
- nur eine Permutation funktioniert. Sie müssen einen Schrägstrich am Ende desBaseAddress
und keinen Schrägstrich am Anfang Ihres relativen URI setzen, wie im folgenden Beispiel.Obwohl ich meine eigene Frage beantwortet habe, dachte ich, ich würde die Lösung hier einbringen, da dieses unfreundliche Verhalten wiederum nicht dokumentiert ist. Mein Kollege und ich verbrachten den größten Teil des Tages damit, ein Problem zu beheben, das letztendlich durch diese Seltsamkeit von verursacht wurde
HttpClient
.quelle
RestClient
, war es fast unsichtbar und bekam überhaupt keine Aufmerksamkeit, und ich sah nie die vollständige URL an meinen Haltepunkten usw.Creating a new HttpClient instance per request can exhaust the available sockets
). Sie sollten also in Betracht ziehen, Using () zu entfernen.Die Referenzauflösung wird durch RFC 3986 Uniform Resource Identifier (URI): Generic Syntax beschrieben . Und genau so soll es funktionieren. Um den Basis-URI-Pfad beizubehalten, müssen Sie am Ende des Basis-URI einen Schrägstrich hinzufügen und am Anfang des relativen URI einen Schrägstrich entfernen.
Wenn der Basis-URI einen nicht leeren Pfad enthält, verwirft die Zusammenführungsprozedur den letzten Teil (nach dem letzten
/
). Relevanter Abschnitt :Wenn der relative URI mit einem Schrägstrich beginnt, wird er als relativer URI für den absoluten Pfad bezeichnet. In diesem Fall ignorieren die Zusammenführungsprozeduren alle Basis-URI-Pfade. Weitere Informationen finden Sie unter 5.2.2. Abschnitt Referenzen transformieren .
quelle
Stieß auf ein Problem mit dem HTTPClient, obwohl die Vorschläge ihn immer noch nicht zur Authentifizierung bringen konnten. Es stellte sich heraus, dass ich ein abschließendes '/' in meinem relativen Pfad brauchte.
dh
quelle
Alternativ - überhaupt nicht verwenden
BaseAddress
. Geben Sie die gesamte URL inGetAsync
() ein.quelle