Объект запроса не декодирует UrlEncoded
-
10-07-2019 - |
Вопрос
С#, ASP.NET 3.5
Я создаю простой URL-адрес с закодированной строкой запроса:
string url = "http://localhost/test.aspx?a=" +
Microsoft.JScript.GlobalObject.escape("áíóú");
что становится красиво: http://localhost/test.aspx?a=%E1%ED%F3%FA (это хорошо)
Когда я отлаживаю test.aspx, я получаю странное декодирование:
string badDecode = Request.QueryString["a"]; //bad
string goodDecode = Request.Url.ToString(); //good
Почему QueryString не декодирует значения?
Решение
Вы можете попробовать использовать HttpServerUtility.UrlEncode вместо.
Документация Microsoft по Microsoft.JScript.GlobalObject.escape заявляет, что он не предназначен для использования непосредственно из вашего кода.
Редактировать:
Как я сказал в комментариях:Эти два метода кодируют по-разному, и Request.QueryString ожидает кодировку, используемую HttpServerUtility.UrlEncode, поскольку внутри него используется HttpUtility.UrlDecode.
(HttpServerUtility.UrlEncode фактически использует HttpUtility.UrlEncode внутри себя.)
Вы можете легко увидеть разницу между двумя методами.
Создайте новое веб-приложение ASP.NET, добавьте ссылку на Microsoft.JScript, а затем добавьте следующий код:
protected void Page_Load(object sender, EventArgs e)
{
var msEncode = Microsoft.JScript.GlobalObject.escape("áíóú");
var httpEncode = Server.UrlEncode("áíóú");
if (Request.QueryString["a"] == null)
{
var url = "/default.aspx?a=" + msEncode + "&b=" + httpEncode;
Response.Redirect(url);
}
else
{
Response.Write(msEncode + "<br />");
Response.Write(httpEncode + "<br /><br />");
Response.Write(Request.QueryString["a"] + "<br />");
Response.Write(Request.QueryString["b"]);
}
}
Результат должен быть:
%E1%ED%F3%FA
%c3%a1%c3%ad%c3%b3%c3%ba
����
áíóú