Considere o código a seguir, onde BaseAddress
define um caminho URI parcial.
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");
}
Eu espero que isso execute um GET
solicitação para http://something.com/api/resource/7
. Mas isso não acontece.
Após algumas pesquisas, acho esta pergunta e resposta: HttpClient with BaseAddress . A sugestão é colocar /
no final doBaseAddress
.
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");
}
Ainda não funciona. Aqui está a documentação: HttpClient.BaseAddress O que está acontecendo aqui?
c#
.net
dotnet-httpclient
Timothy Shields
fonte
fonte
Respostas:
Acontece que, das quatro permutações possíveis de incluir ou excluir barras à direita ou à esquerda no
BaseAddress
URI relativo e passado para oGetAsync
método - ou qualquer outro método deHttpClient
- apenas uma permutação funciona. Você deve colocar uma barra no final doBaseAddress
e não deve colocar uma barra no início do seu URI relativo, como no exemplo a seguir.Mesmo tendo respondido minha própria pergunta, achei que contribuiria com a solução aqui, pois, novamente, esse comportamento hostil não é documentado. Meu colega e eu passamos a maior parte do dia tentando resolver um problema que foi causado por essa estranheza
HttpClient
.fonte
RestClient
, era quase invisível e nãoCreating a new HttpClient instance per request can exhaust the available sockets
). Portanto, você deve considerar a remoção de Using ().A resolução de referência é descrita pelo URI (RFC 3986 Uniform Resource Identifier): Sintaxe genérica . E é exatamente assim que deveria funcionar. Para preservar o caminho do URI base, você precisa adicionar uma barra no final do URI base e remover a barra no início do URI relativo.
Se o URI base contiver um caminho não vazio, o procedimento de mesclagem descartará a última parte (depois da última
/
). Seção relevante :Se o URI relativo começar com uma barra, ele será chamado de URI relativo do caminho absoluto. Nesse caso, o procedimento de mesclagem ignora todo o caminho URI base. Para mais informações, consulte 5.2.2. Seção Transformar referências .
fonte
Ocorreu um problema com o HTTPClient, mesmo com as sugestões ainda não foi possível autenticar. Acontece que eu precisava de um '/' à direita no meu caminho relativo.
ie
fonte
Como alternativa - não use
BaseAddress
nada. Coloque o URL inteiro emGetAsync
()fonte