Почему базовому адресу 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.Базовый адрес что происходит здесь?

602   3  

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. Преобразование Ссылок раздел.

альтернативно-не использовать BaseAddress на всех. Поставить полный URL-адрес в GetAsync()

Comments

    Ничего не найдено.