Как получить строку запроса, если она кодирована по URLE или имеет символы процента в ASP.NET

StackOverflow https://stackoverflow.com/questions/1638499

Вопрос

Как получить фактическую строку запроса из объекта запроса, если строка запроса имеет код 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 " назад?

Это было полезно?

Решение

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

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

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

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

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

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

Другие советы

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

HttpUtility.UrlEncode(Request.QueryString["p"])
HttpContext.Current.Request.ServerVariables["QUERY_STRING"]

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top