Получение ошибки 400/404-HttpUtility.UrlEncode не кодирует полную строку?
Почему следующие URL-адреса дают мне ошибки IIS ниже:
A) http://192.168.1.96/cms/View.aspx / Show / Small+test '
A2) http://192.168.1.96/cms/View.aspx / Show/Small%20test '
B) http://192.168.1.96/cms/View.aspx / показать/'%26$%23funky**!!~"+Страница
Ошибка:
HTTP Error 404.11 - Not Found
The request filtering module is configured to deny a request that contains a double escape sequence.
Ошибка для B:
HTTP Error 400.0 - Bad Request
ASP.NET detected invalid characters in the URL.
Последняя часть URL-адреса после /Show / - это Результат после отправки текста через HttpUtility.UrlEncode() Итак, согласно Microsoft, это URL, закодированный правильно.
Если я пользователь HttpUtility.UrlPathEncode (), а не HttpUtility.UrlEncode() я получаю результаты A2. Но B в конечном итоге выглядит так:
Http://192.168.1.96/TVCMS-CVJZ/cms/View.aspx / показать/'&$#фанки**!!~"%20page
Что является все еще неправильным. Знает ли Microsoft, как вообще кодировать URL? Есть ли функция, которую кто-то написал, чтобы сделать это правильный путь?
Редактировать:
Я написал свой собственный кодер:
static public string UrlEncode(string encode)
{
if (encode == null) return null;
string encoded = "";
foreach (char c in encode)
{
int val = (int)c;
if ((val >= 48 && val <= 57) || (val >= 65 && val <= 90) || (val >= 97 && val <= 122))
encoded += c;
else
encoded += "%" + val.ToString("X");
}
return encoded;
}
Функция работает с A2 выше просто отлично результат для B:
Http://192.168.1.96/cms/View.aspx / Show / %27%26% 24%23funky%2A%2A%21%21~%27%27%20 страниц
Но даже если это выглядит как хороший действительный URL IIS все равно дает мне
HTTP Error 400.0-неверный запрос ASP.NET обнаружены недопустимые символы в URL-адресе.
1 ответ:
Хорошо, отвечаю на свой собственный вопрос... ненавижу это делать, но я получил ответ после долгих поисков.
Короче говоря, Microsoft во всей своей красе решила снова не придерживаться международного стандарта.%, &, *, или : не может быть в URL-адресе, закодированном или декодированном раньше ? по любой причине.
Чтобы обойти это, я должен написано мое собственное кодирование и декодирование:
static public string UrlEncode(string encode) { if (encode == null) return null; string encoded = ""; foreach (char c in encode) { int val = (int)c; if (val == 32 || val == 45 || (val >= 48 && val <= 57) || (val >= 65 && val <= 90) || (val >= 97 && val <= 122)) encoded += c; else encoded += "%" + val.ToString("X"); } // Fix MS BS encoded = encoded.Replace("%25", "-25").Replace("%2A", "-2A").Replace("%26", "-26").Replace("%3A", "-3A"); return encoded; } static public string UrlDecode(string decode) { if (decode == null) return null; // Fix MS BS decode = decode.Replace("-25", "%25").Replace("-2A", "%2A").Replace("-26", "%26").Replace("-3A", "%3A"); return HttpUtility.UrlDecode(decode); }
На данный момент ни одна из функций не поддерживает Unicode, но пока она работает.