Considérez le code suivant, où le BaseAddress
définit un chemin d'URI partiel.
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");
}
Je m'attends à ce que cela effectue une GET
demande http://something.com/api/resource/7
. Mais ce n'est pas le cas.
Après quelques recherches, je trouve cette question et réponse: HttpClient avec BaseAddress . La suggestion est de placer /
à la fin du 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 ne marche toujours pas. Voici la documentation: HttpClient.BaseAddress Que se passe-t-il ici?
c#
.net
dotnet-httpclient
Timothy Shields
la source
la source
Réponses:
Il s'avère que, sur les quatre permutations possibles d'inclusion ou d'exclusion de barres obliques de fin ou de début sur l'
BaseAddress
URI relatif et transmises à laGetAsync
méthode - ou à toute autre méthode deHttpClient
- une seule permutation fonctionne. Vous devez placer une barre oblique à la fin deBaseAddress
, et vous ne devez pas placer de barre oblique au début de votre URI relatif, comme dans l'exemple suivant.Même si j'ai répondu à ma propre question, j'ai pensé apporter la solution ici car, encore une fois, ce comportement hostile n'est pas documenté. Mon collègue et moi avons passé la majeure partie de la journée à essayer de résoudre un problème qui a finalement été causé par cette bizarrerie de
HttpClient
.la source
RestClient
, il était presque invisible et n'a attiré aucune attention, et je n'ai jamais vu l'URL complète à mes points d'arrêt, etc.Creating a new HttpClient instance per request can exhaust the available sockets
). Vous devriez donc envisager de supprimer Using ().La résolution de référence est décrite par RFC 3986 Uniform Resource Identifier (URI): syntaxe générique . Et c'est exactement ainsi que cela devait fonctionner. Pour conserver le chemin de l'URI de base, vous devez ajouter une barre oblique à la fin de l'URI de base et supprimer la barre oblique au début de l'URI relatif.
Si l'URI de base contient un chemin non vide, la procédure de fusion ignore sa dernière partie (après la dernière
/
). Section pertinente :Si l'URI relatif commence par une barre oblique, il est appelé un URI relatif à chemin absolu. Dans ce cas, la procédure de fusion ignore tous les chemins URI de base. Pour plus d'informations, consultez 5.2.2. Transformer la section Références .
la source
Ran dans un problème avec le HTTPClient, même avec les suggestions n'a toujours pas pu l'authentifier. Il s'avère que j'avais besoin d'un '/' de fin dans mon chemin relatif.
c'est à dire
la source
Alternativement - ne pas utiliser
BaseAddress
du tout. Mettez l'URL entière dansGetAsync
()la source