Warum funktioniert HttpClient BaseAddress nicht?
Betrachten Sie den folgenden code, wo die BaseAddress
definiert eine partielle URI-Pfad.
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 dieses zum ausführen einer GET
Anfrage http://something.com/api/resource/7
. Aber es funktioniert nicht.
Nach etwas Suche, finde ich diese Frage und Antwort: HttpClient mit BaseAddress. Der Vorschlag ist auf Platz /
auf das Ende der 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 denn hier Los?
Kommentar zu dem Problem
Mögliche Duplikate von HttpClient mit BaseAddress
@ГеоргийЛанец Der Rückseite duplizieren bereits vorgeschlagen. Ich schrieb diese Frage, gerade weil, die andere Frage war nicht auf eine Weise geschrieben, die war sehr sichtbar, indem Menschen mit dem gleichen problem, und ich schrieb die Antwort hier, weil die Antwort dort aufgehört hat, ein wichtiger Punkt.
@ГеоргийЛанец das ist nicht, wie es funktioniert. In der Regel die "kanonischen" Frage ist, bekommt Sie die Duplikate, Sie verweisen. Dass die andere Frage war die, über ein problem, dass Benutzer war zu Lesen, anstatt wie ein FAQ.
@ГеоргийЛанец Auch bemerken, dass ich-Referenz, die andere Frage, in dieser Frage, und ich erkläre, warum die andere Frage-und Antwort-sind unzureichend für die Lösung des Problems.
Vielen Dank, Timothy.
InformationsquelleAutor der Frage Timothy Shields | 2014-05-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es stellt sich heraus, dass von den vier möglichen Permutationen mit oder ohne trailing oder führenden Schrägstriche auf der
BaseAddress
und die relative URI übergeben, um dieGetAsync
Methode -- oder welche andere MethodeHttpClient
-- nur eine permutation funktioniert. Sie muss Ort ein slash am Ende desBaseAddress
, und Sie muss nicht Ort ein Schrägstrich am Anfang Ihrer relativen URI, wie im folgenden Beispiel.Obwohl ich meine Frage selbst beantwortet, ich dachte, ich würde tragen Sie die Lösung hier, da, wieder dieses unfreundliche Verhalten ist nicht dokumentiert. Meine Kollegin und ich verbrachten fast den ganzen Tag versuchen, ein problem zu lösen, war letztlich verursacht durch diese Eigenheit von
HttpClient
.InformationsquelleAutor der Antwort Timothy Shields
Referenz-Lösung beschrieben, die durch RFC 3986-Uniform Resource Identifier (URI): Generic Syntax. Und das ist genau, wie es funktionieren soll. Bewahren Basis-URI-Pfad, den Sie brauchen, um hinzuzufügen, slash am Ende der Basis-URI und entfernen Sie den Schrägstrich am Anfang der relative URI.
Wenn die Basis-URI enthält nicht-leeren Pfad, merge-Verfahren verwirft es den letzten Teil (nach dem letzten
/
). Relevante Abschnitt:Wenn die relative URI beginnt mit einem slash, wird er als absoluter Pfad relativer URI. In diesem Fall wird merge-Verfahren ignorieren alle Basis-URI-Pfad. Für weitere Informationen überprüfen Sie die 5.2.2. Verwandeln Referenzen Abschnitt.
InformationsquelleAutor der Antwort Leonid Vasilyev