Почему базовому адресу HttpClient, который не работает?
рассмотрим следующий код, где BaseAddress определяет частичный путь 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");
}
Я ожидаю, что это будет выполнять GET запрос http://something.com/api/resource/7. Но это не так.
после некоторого поиска, я нахожу этот вопрос и ответ: HttpClient с BaseAddress. Предложение состоит в том, чтобы разместить / по конец 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");
}
он все еще не работает. Вот документация: HttpClient.Базовый адрес что происходит здесь?
3 ответов:
получается, что из четырех возможных перестановок включения или исключения замыкающих или ведущих вперед косых черт на
BaseAddressи относительный URI передается вGetAsyncметод -- или любой другой методHttpClient- только один перестановку работает. Ты должны поместите косую черту в концеBaseAddressи не должен поместите косую черту в начале вашего относительного 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"); }хотя я ответил на свой собственный вопрос, я решил, что внесу решение здесь, так как, опять же, это недружественное поведение недокументировано. Мой коллега и я провели большую часть дня, пытаясь решить проблему, которая в конечном итоге была вызвана этой странностью
HttpClient.
разрешение ссылки описывается RFC 3986 Uniform Resource Identifier (URI): универсальный синтаксис. И это именно то, как он должен работать. Чтобы сохранить путь базового URI, необходимо добавить косую черту в конце базового URI и удалить косую черту в начале относительного URI.
если базовый URI содержит непустой путь, процедура слияния отбрасывает его последнюю часть (после last
/). Уместно раздел:5.2.3. Объединить Пути
псевдокод выше относится к процедуре "слияния" для слияния a ссылка относительного пути с путем базового URI. Это выполняется следующим образом:
если базовый URI имеет определенный компонент полномочий и пустой путь, а затем возвращает строку, состоящую из"/", связанных с путь ссылки; в противном случае
возвращает строку, состоящую из компонента пути ссылки добавляется ко всем, кроме последнего сегмента пути базового URI (т. е., исключение любых символов после самого правого "/" в базовом URI путь, или исключая весь базовый путь URI, если он не содержит никакие символы.)
если относительный URI начинается с косой черты, он называется относительным URI абсолютного пути. В этом случае процедура слияния игнорирует весь базовый путь URI. Для получения дополнительной информации посетите 5.2.2. Преобразование Ссылок раздел.
Comments