Как получить строку запроса, если она имеет URLEncoded или имеет символы процента в ASP.NET - PullRequest
2 голосов
/ 28 октября 2009

Как получить фактическую строку запроса из объекта «Запрос», если строка запроса имеет код UrlEncoded или содержит символы процента в ASP.NET?

Как правило, если у меня есть такой URL: Default.aspx?p=%b4, как мне получить строку, заполненную "% b4"?

Request.QueryString["p"] возвращает непечатный символ.

Request.RawUrl возвращает Default.aspx? P =% ufffd "

Request.Url.AbsoluteUri возвращает Default.aspx? P =% EF% BF% BD

Как мне вернуть "% b4"?

Ответы [ 4 ]

4 голосов
/ 28 октября 2009

Я углубился в это и думаю, что знаю, что является причиной этого: HTTP-клиент отправляет URL-адрес на сервер, который не имеет правильной URL-кодировки. В частности, в URL есть недопустимый символ.

Чтобы воспроизвести, вставьте следующее в конце вашего URL в IE8: default.aspx?p=´

Если вы изучите байты, проходящие по проводам (например, используя Fiddler ), вы увидите, что в URL-адресе от клиента к серверу отправляется фактический символ Hex B4. Это недопустимый символ в URL-адресе, поскольку URL-адреса ограничены символами в формате 0x80 (любые коды символов больше 0x80 должны быть экранированы в процентах).

Таким образом, ваш клиент передает недопустимый символ, и ваш сервер (правильно) заменяет поддельный символ на% EF% BF% BD, который является кодировкой UTF-8 для символа замены Unicode (U + 0FFD) ) , что происходит, когда встречается символ, который не имеет эквивалента в локальной кодировке.

AFAIK, это ошибка в IE. Если вы введете тот же URL-адрес в Firefox, Firefox будет правильно кодировать URL-адрес (как% b4 вместо ´). Обратите внимание, что, как и AFAIK, проблема возникает только при ручном вставлении недопустимых символов в адресную строку IE - если тот же символ присутствует в ссылке, IE, похоже, правильно кодирует URL (по крайней мере, в тех случаях, которые я тестировал).

Итак, вы должны выяснить, кто отправляет вам этот поддельный URL, и сказать им, чтобы они начали правильно кодировать свои URL!

1 голос
/ 28 октября 2009

Asp.net автоматически декодирует URL-адреса, когда вы выполняете Request.Querystring ["key"]. Вам просто нужно закодировать это снова.

HttpUtility.UrlEncode(Request.QueryString["p"])
0 голосов
/ 27 марта 2014

У меня была такая же проблема. Я решил это, просто добавив в javascript "escape ('text% text')" при создании строки запроса!

0 голосов
/ 28 октября 2009
HttpContext.Current.Request.ServerVariables["QUERY_STRING"]

вернет строку запроса RAW

...