Je travaille sur une application client qui utilise un service reposant pour rechercher des sociétés par leur nom. Il est important que je puisse inclure des esperluettes littérales dans mes requêtes, car ce caractère est assez commun dans les noms de sociétés.Esperluettes littérales dans la chaîne de requête System.Uri
Cependant, chaque fois que je passe% 26 (le caractère d'esperluette URI échappé) à System.Uri
, il le convertit en un caractère esperluette! En y regardant de plus près, les deux seuls caractères qui ne sont pas reconvertis sont hash (% 23) et percent (% 25).
Disons que je veux rechercher une entreprise nommée « Pierce & Pierce »:
var endPoint = "http://localhost/companies?where=Name eq '{0}'";
var name = "Pierce & Pierce";
Console.WriteLine(new Uri(string.Format(endPoint, name)));
Console.WriteLine(new Uri(string.Format(endPoint, name.Replace("&", "%26"))));
Console.WriteLine(new Uri(string.Format(endPoint, Uri.EscapeUriString(name))));
Console.WriteLine(new Uri(string.Format(endPoint, Uri.EscapeDataString(name))));
Les quatre combinaisons ci-dessus retour:
http://localhost/companies?where=Name eq 'Pierce & Pierce'
Cela provoque des erreurs du côté du serveur depuis l'esperluette est (correctement) interprétée comme un délimiteur d'argument de requête. Ce que je vraiment besoin de revenir est la chaîne d'origine:
http://localhost/companies?where=Name eq 'Pierce %26 Pierce'
Comment puis-je contourner ce problème sans jeter entièrement System.Uri
? Je ne peux pas remplacer toutes les esperluettes par% 26 au dernier moment car il y aura généralement plusieurs arguments de requête impliqués et je ne veux pas détruire leurs délimiteurs.
Note: Un problème similaire a été discuté dans this question mais je me réfère spécifiquement à System.Uri
.
Ah, maintenant je comprends. ToString() est une version lisible par un humain non échappée de l'uri. –