Considere el siguiente código, donde BaseAddress
define una ruta de 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");
}
Espero que esto realice una GET
solicitud a http://something.com/api/resource/7
. Pero no lo hace.
Después de buscar un poco, encuentro esta pregunta y respuesta: HttpClient con BaseAddress . La sugerencia es colocar /
al final de la 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");
}
Aún no funciona. Aquí está la documentación: HttpClient.BaseAddress ¿Qué está pasando aquí?
c#
.net
dotnet-httpclient
Timothy Shields
fuente
fuente
Respuestas:
Resulta que, de las cuatro posibles permutaciones de incluir o excluir las barras inclinadas hacia adelante o hacia atrás en el
BaseAddress
URI relativo pasado alGetAsync
método, o cualquier otro método deHttpClient
, solo funciona una permutación. Usted debe colocar una barra al final de laBaseAddress
, y usted no debe colocar una barra al comienzo de su URI relativo, como en el siguiente ejemplo.Aunque respondí mi propia pregunta, pensé que contribuiría con la solución aquí ya que, nuevamente, este comportamiento hostil no está documentado. Mi colega y yo pasamos la mayor parte del día tratando de solucionar un problema que finalmente fue causado por esta rareza de
HttpClient
.fuente
RestClient
, era casi invisible y no recibió ninguna atención, y nunca vi la url completa en mis puntos de interrupción, etc.Creating a new HttpClient instance per request can exhaust the available sockets
). Por lo tanto, debe considerar eliminar Using ().La resolución de referencia se describe mediante el identificador uniforme de recursos (URI) RFC 3986: sintaxis genérica . Y así es exactamente como se supone que funciona. Para preservar la ruta del URI base, debe agregar una barra diagonal al final del URI base y eliminar la barra diagonal al comienzo del URI relativo.
Si el URI base contiene una ruta no vacía, el procedimiento de fusión descarta su última parte (después de la última
/
). Sección relevante :Si el URI relativo comienza con una barra oblicua, se llama URI relativo de ruta absoluta. En este caso, el procedimiento de fusión ignora toda la ruta base de URI. Para más información verifique 5.2.2. Transformar la sección de referencias .
fuente
Se encontró con un problema con el HTTPClient, incluso con las sugerencias todavía no se pudo autenticar. Resulta que necesitaba un '/' final en mi ruta relativa.
es decir
fuente
Alternativamente, no lo use
BaseAddress
en absoluto. Ponga la URL completa enGetAsync
()fuente