2009-10-28 15 views
2

Comment obtenir la chaîne de requête réelle de l'objet Request lorsque la chaîne de requête est UrlEncoded ou a des caractères de pourcentage dans ASP.NET? Fondamentalement, si j'ai une URL comme ceci: Default.aspx?p=%b4, comment puis-je obtenir une chaîne remplie avec "% b4"?Comment faire pour obtenir une chaîne de requête quand elle est URLEncodée ou a des caractères en pourcentage dans ASP.NET

Request.QueryString["p"] renvoie un caractère non imprimable.

Request.RawUrl retours Default.aspx? P =% uFFFD »

Request.Url.AbsoluteUri retours Default.aspx? P =% EF% BF% BD

Comment puis-je obtenir "% b4" retour?

Répondre

4

J'ai creusé plus loin, et crois que je sais ce qui en est la cause: un client HTTP envoie une URL au serveur qui n'est pas correctement encodée en URL.En particulier, il y a un caractère invalide dans l'adresse URL

, collez ce qui suit à t La fin de votre URL dans IE8: default.aspx?p=´

Si vous examinez les octets passant au-dessus du fil (par ex. en utilisant Fiddler), vous verrez un caractère hexadécimal B4 envoyé du client au serveur dans l'URL. Ceci est un caractère illégal dans une URL, puisque les URL sont limitées aux codes char sous 0x80 (tous les caractères char-plus-que-0x80 doivent être échappés en pourcentage). Donc votre client passe un caractère invalide, et votre serveur remplace (correctement) le caractère faux avec% EF% BF% BD qui est le codage UTF-8 pour le Unicode Replacement Character (U+0FFD), ce qui arrive quand un personnage est rencontré qui n'a pas d'équivalent dans le codage local. Autant que je sache, c'est un bug dans Internet Explorer. Si vous tapez la même URL dans Firefox, Firefox encodera l'URL correctement (en% b4 au lieu de '). Notez que, aussi AFAIK, le problème se produit uniquement lorsque vous collez manuellement des caractères invalides dans la barre d'adresse d'IE - si le même caractère est présent dans un lien, IE semble encoder l'URL correctement (au moins dans les cas que j'ai testés).

Vous devriez donc savoir qui vous envoie cette URL bidon et leur dire de commencer à encoder correctement leurs URL!

+0

Hmm. J'ai testé le code ci-dessus sur IE8 et asp.net 3.5. Je me demande si c'est une chose spécifique au navigateur où le navigateur fait l'encodage avant que votre code ne s'en occupe? Ou peut-être la différence de comportement d'une version .net? Quel navigateur et quelle version de .net utilisez-vous? Aussi, quel est le codage de la requête de votre page? Voir http://msdn.microsoft.com/en-us/library/39d1w2xf.aspx pour plus d'informations sur l'encodage. –

+0

Salut Justin, Merci, je vais chercher plus loin. –

+0

BTW, j'ai creusé un peu plus dans ce domaine et est venu avec ce que je pense est la cause du problème que vous voyez. Jetez un oeil à ma réponse révisée ci-dessus. –

0
HttpContext.Current.Request.ServerVariables["QUERY_STRING"] 

retournera de la requête RAW chaîne

+0

Non, cela retourne un caractère non imprimable. –

+0

try HttpContext.Current.Request.ServerVariables ["QUERY_STRING"] – Aaron

1

Asp.net sera stuff Decode automatiquement URL lorsque vous faites Request.QueryString [ "touche"]. Vous avez juste besoin de l'encoder à nouveau.

HttpUtility.UrlEncode(Request.QueryString["p"]) 
0

J'ai eu le même problème. Je l'ai résolu simplement en ajoutant javascript "escape ('text% text')" en construisant la chaîne de requête!