Rozważ następujący kod, w którym BaseAddress
definiuje częściową ścieżkę URI.
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");
}
Oczekuję, że spełni to GET
żądanie http://something.com/api/resource/7
. Ale tak nie jest.
Po kilku poszukiwaniach znajduję to pytanie i odpowiedź: HttpClient z BaseAddress . Sugeruje się, aby umieścić /
na końcu 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");
}
To wciąż nie działa. Oto dokumentacja: HttpClient.BaseAddress Co się tutaj dzieje?
c#
.net
dotnet-httpclient
Tarcze Tymoteusza
źródło
źródło
Odpowiedzi:
Okazuje się, że z czterech możliwych kombinacji włączenia lub wyłączenia ukośników końcowych lub wiodących do przodu na
BaseAddress
względnym URI przekazanym doGetAsync
metody - lub innej metodyHttpClient
- działa tylko jedna permutacja. Państwo musi umieścić ukośnik na końcuBaseAddress
, a nie musi umieścić ukośnik na początku swojej względnej URI, jak w poniższym przykładzie.Mimo że odpowiedziałem na własne pytanie, pomyślałem, że przyczynię się do rozwiązania tego problemu, ponieważ to nieprzyjazne zachowanie jest nieudokumentowane. Mój kolega i ja spędziliśmy większość dnia, próbując rozwiązać problem, który został ostatecznie spowodowany tą dziwnością
HttpClient
.źródło
RestClient
, był prawie niewidoczny i nie zwrócił na mnie uwagi, i nigdy nie widziałem pełnegoCreating a new HttpClient instance per request can exhaust the available sockets
). Więc powinieneś rozważyć usunięcie Using ().Rozdzielczość odniesienia opisano w dokumencie RFC 3986 Uniform Resource Identifier (URI): Ogólna składnia . I tak właśnie powinno działać. Aby zachować podstawową ścieżkę URI, musisz dodać ukośnik na końcu podstawowego identyfikatora URI i usunąć ukośnik na początku względnego identyfikatora URI.
Jeśli podstawowy identyfikator URI zawiera niepustą ścieżkę, procedura scalania odrzuca jej ostatnią część (po ostatniej
/
). Odpowiednia sekcja :Jeśli względny identyfikator URI zaczyna się od ukośnika, nazywany jest względnym identyfikatorem URI ścieżki bezwzględnej. W takim przypadku procedura scalania zignoruje całą podstawową ścieżkę URI. Aby uzyskać więcej informacji, sprawdź 5.2.2. Przekształć sekcję Odniesienia .
źródło
Wystąpił problem z klientem HTTPClient, nawet jeśli sugestie wciąż nie mogły go uwierzytelnić. Okazuje się, że potrzebowałem trailing '/' na mojej względnej ścieżce.
to znaczy
źródło
Alternatywnie - nie używaj
BaseAddress
w ogóle. Umieść cały adres URL wGetAsync
()źródło