Quelle est la différence entre Request.Url.Query et Request.QueryString?
J'ai été à la poursuite d'un bug sur la Réécriture d'Url de l'application. Le bug a montré que l'encodage d'un problème sur certains caractères diacritiques dans la chaîne de requête.
Fondamentalement, le problème a été qu'une demande a été fondamentalement /recherche.aspx?search=heřmánek a se réécrit avec une chaîne de requête de recherche "=il%c5%99%c3%a1nek"
La valeur correcte (à l'aide de certains différents, code de travail) est une réécriture de l'ensemble de la chaîne de recherche "search=il%u0159m%u00e1nek"
Noter la différence entre les deux chaînes. Toutefois, si vous postez un message à la fois, vous verrez que le Codage d'Url reproduit la même chaîne. Il n'est pas jusqu'à ce que vous utilisez le contexte.La fonction de réécriture que le codage des pauses. La chaîne brisée renvoie 'heÅmánek' (à l'aide de la Demande.QueryString["Recherche"] et le travail de la chaîne de retour heřmánek'. Ce changement se produit après l'appel à la fonction de réécriture.
J'ai tracé cette baisse à un ensemble de code à l'aide de la Demande.QueryString (de travail) et l'autre à l'aide de la Demande.Url.Requête (requête.Url renvoie une instance d'Uri).
Alors que j'ai travaillé le bug il y a un trou dans ma compréhension, donc si quelqu'un sait la différence, je suis prêt pour la leçon.
source d'informationauteur Bruce Chapman
Vous devez vous connecter pour publier un commentaire.
Ce que vous avez indiqué comme "cassé" chaîne codée est en fait l'encodage correct selon les normes. Celui que vous avez indiqué comme "correcte" encodage à l'aide d'un non-standard de l'extension du cahier des charges afin de permettre à un format de
%uXXXX
(je crois que c'est censé indiquer l'encodage UTF-16).Dans tous les cas, le "cassé" chaîne codée est ok. Vous pouvez utiliser le code suivant pour tester:
Fonctionne très bien. Mais... sur une intuition, j'ai essayé UrlDecode Latin-1 page de codes spécifiée, au lieu de la valeur par défaut UTF-8:
... et j'ai eu la mauvaise valeur spécifiée, 'heÅmánek'. En d'autres termes, il ressemble à l'appel à
HttpContext.RewritePath()
en quelque sorte des changements de l'encodage/décodage d'utiliser le Latin-1 page de codes, plutôt que de l'UTF-8, qui est l'encodage utilisé par défaut par le UrlEncode/Décoder des méthodes.Cela ressemble à un bug, si vous me demandez. Vous pouvez regarder le
RewritePath()
code de réflecteur et de voir que c'est bien de jouer avec la querystring - transmettre autour de toutes sortes de chemin d'accès virtuel fonctions, et pour certains non géré IIS code.Je me demande si quelque part le long du chemin, l'Uri au cœur de l'objet de la Requête obtient manipulé avec le mauvais code? Qui pourrait expliquer pourquoi
Request.Querystring
(qui n'est simplement que les premières valeurs des en-têtes HTTP) serait correct, tandis que l'Uri de l'utilisation de la mauvaise codant pour la diacriticals serait incorrect.Votre question vraiment éveillé mon intérêt, j'ai donc fait un peu de lecture pour la dernière heure. Je ne suis pas tout à fait positif que j'ai trouvé la réponse, mais je vais le jeter là-bas pour voir ce que vous en pensez.
De ce que j'ai lu jusqu'à présent, Demande.QueryString est en fait "une version analysée de la variable QUERY_STRING dans la collection ServerVariables" [référence] où, à la Demande.L'Url est (comme vous l'avez dit) l'URL brut encapsulé dans l'Uri de l'objet. Selon cet articlela classe Uri " constructor "...analyse l'url [chaîne], le met dans un format canonique, et rend toute échapper encodages."
Par conséquent, il apparaît que la Demande.QueryString utilise une autre fonction pour analyser la "QUERY_STRING" variable de la ServerVariables constructeur. Cela pourrait expliquer pourquoi vous voyez la différence entre les deux. Maintenant, pourquoi les différentes méthodes de codage sont utilisés par la coutume fonction d'analyse syntaxique et l'Uri de l'objet de l'analyse de la fonction est entièrement au-delà de moi. Peut-être quelqu'un d'un peu plus versé sur le aspnet_isapi DLL pourrait apporter quelques réponses à cette question.
De toute façon, j'espère que mon post a du sens. Sur une note de côté, je voudrais ajouter une autre référence qui a également fourni quelques très complet et intéressant à lire: http://download.microsoft.com/download/6/c/a/6ca715c5-2095-4eec-a56f-a5ee904a1387/Ch-12_HTTP_Request_Context.pdf
J'ai fait un peu de recherche au cours de la journée et je pense avoir quelques informations.
Lorsque vous utilisez la Demande.Querystring ou HttpUtility.UrlDecode (ou Coder) c'est à l'aide de l'Encodage spécifié dans l'élément (en particulier le requestEncoding attribut) du web.config (ou la .hiérarchie de configuration si vous n'avez pas spécifié) ---PAS de l'Encodage.Par défaut, qui est l'encodage par défaut de votre serveur.
Lorsque vous avez de l'encodage en UTF-8, un caractère unicode peut être codée sous la forme de 2 %xx des valeurs hexadécimales. Il sera également décodé de cette façon, lorsque compte tenu de l'ensemble de la valeur.
Si vous êtes UrlDecoding avec un Encodage différent de l'url a été codé avec, vous obtiendrez un résultat différent.
Depuis HttpUtility.UrlEncode et UrlDecode peut prendre un paramètre d'encodage, il peut être tentant d'essayer de coder à l'aide d'une page de codes ANSI, mais UTF-8 est la bonne façon de faire si vous avez la prise en charge du navigateur (apparemment les anciennes versions ne prennent pas en charge UTF-8). Vous avez juste besoin de s'assurer que la est installé correctement et que les deux parties fonctionnent bien.
UTF-8 Semble être l'encodage par défaut: (à partir de .net Système de réflecteur.Web.HttpRequest)
En suivant le chemin pour trouver le.ContentEncoding vous conduit à l' (également dans HttpRequest)
Pour répondre à votre question sur la différence entre la Demande.Url.Quer et de la Demande.QueryString... voici comment HttpRequest construit sa Propriété Url:
Vous pouvez le voir, il est à l'aide de la HttpEncoder classe pour faire le décodage, mais il utilise le même QueryStringEncoding valeur.
Depuis que je suis déjà poster beaucoup de code ici et n'importe qui peut l'obtenir .NET Réflecteur, je vais extrait de le reste. La propriété QueryString vient de la HttpValueCollection qui utilise FillFromEncodedBytes méthode pour finalement appeler HttpUtility.UrlDecode (avec le QueryStringEncoding valeur définie ci-dessus), qui a finalement appels de la HttpEncoder pour les décoder.
Ils ne semblent utiliser différentes méthodes pour décoder les octets de la chaîne de requête, mais l'encodage qu'ils utilisent pour le faire semble être le même.
Il est intéressant pour moi que le HttpEncoder a de nombreuses fonctions qui semblent faire la même chose, de sorte que son possible, il existe des différences dans les méthodes qui peuvent causer un problème.