Рассмотрим следующий код, где 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.BaseAddress Что здесь происходит?
c#
.net
dotnet-httpclient
Тимоти Шилдс
источник
источник
Ответы:
Оказывается, из четырех возможных перестановок, включающих или исключающих конечные или ведущие косые черты на
BaseAddress
и относительный URI, передаваемый вGetAsync
методу - или любому другому методуHttpClient
- работает только одна перестановка. Вы должны поместить косую черту в концеBaseAddress
, и вы не должны помещать косую черту в начало вашего относительного URI, как в следующем примере.Несмотря на то, что я ответил на свой собственный вопрос, я решил внести здесь свое решение, поскольку, опять же, это недружественное поведение недокументировано. Мы с коллегой провели большую часть дня, пытаясь решить проблему, которая в конечном итоге была вызвана этой странностью
HttpClient
.источник
RestClient
, он был почти невидим и не привлек к себе никакого внимания, и я никогда не видел полный URL на моих контрольных точках и т. Д.Creating a new HttpClient instance per request can exhaust the available sockets
). Поэтому вы должны рассмотреть возможность удаления с помощью ().Ссылочное разрешение описывается в RFC 3986 Унифицированный идентификатор ресурса (URI): общий синтаксис . И это именно так, как это должно работать. Чтобы сохранить базовый путь URI, необходимо добавить косую черту в конце базового URI и удалить косую черту в начале относительного URI.
Если базовый URI содержит непустой путь, процедура слияния отбрасывает свою последнюю часть (после последней
/
). Соответствующий раздел :Если относительный URI начинается с косой черты, он называется относительным URI абсолютного пути. В этом случае процедура слияния игнорирует все базовые пути URI. Для получения дополнительной информации проверьте 5.2.2. Раздел « Преобразование ссылок ».
источник
Столкнулся с проблемой с HTTPClient, даже с предложениями все еще не мог заставить его аутентифицироваться. Оказывается, мне нужен конечный «/» в моем относительном пути.
т.е.
источник
В качестве альтернативы - не использовать
BaseAddress
вообще. Поместите весь URL вGetAsync
()источник