2010-05-20 2 views
4

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.

Répondre

10

Ce n'est pas seulement l'esperluette qui est incorrecte dans l'URL. Une URL valide ne peut pas contenir d'espaces.

La méthode EscapeDataString fonctionne très bien pour coder la chaîne correctement, et vous devez coder la totalité de la valeur, non seulement le nom:

Uri.EscapeDataString("Name eq 'Pierce & Pierce'") 

Résultat:

Name%20eq%20'Pierce%20%26%20Pierce' 

Lorsque vous créez un Uri en utilisant cette chaîne, ce sera correct. Pour voir l'URL, vous pouvez utiliser la propriété AbsoluteUri. Si vous convertissez simplement le Uri en une chaîne (qui appelle la méthode ToString), l'URL ne sera pas échappée et sera donc incorrecte.

+0

Ah, maintenant je comprends. ToString() est une version lisible par un humain non échappée de l'uri. –

0

Je rencontre le même problème. Bien que la chaîne de requête soit échappée avec Uri.EscapeDataString et que la propriété AbsoluteUri la répète correctement, WebBrowser envoie l'Uri au format non échappé.

currentUri = new System.Uri(ServerAgent.urlBase + "/MailRender?uid=" 
+ Uri.EscapeDataString(uid); 

webBrowser.Navigate (currentUri);

signe plus ('+') est convertir en% 2B, mais le serveur toujours obtenir + dans l'URL, qui est ensuite converti à l'espace (» «) par l'intermédiaire HttpServeletRequest.getParameter() appelez

0

J'ai résolu ce problème en créer une classe dérivée d'Uri

class Uri2 : System.Uri 
{ 
    public Uri2(string url) : base(url) 
    { 
    } 

    public override string ToString() 
    { 
     return AbsoluteUri; 
    } 
} 

en tout lieu System.Uri est utilisé, URI2 remplacé. Je ne sais pas si c'est un bug de. NetCF, WebBrowser devrait envoyer l'URL au format encodé, c'est-à-dire la valeur de AbsoluteUri, mais pas la valeur de ToString()

Questions connexes