Получение ошибки 400/404 - HttpUtility.UrlEncode не кодирует полную строку? - PullRequest
8 голосов
/ 05 января 2011

Почему следующие URL дают мне ошибки IIS ниже:

А) http://192.168.1.96/cms/View.aspx/Show/Small+test'

A2) http://192.168.1.96/cms/View.aspx/Show/Small%20test' <- это работает, но не является результатом HttpUtility.UrlEncode () </p>

B) http://192.168.1.96/cms/View.aspx/Show/'%26$%23funky**!!~''+page

Ошибка для A:

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/Show/'&$#funky**!!~''%20page

что все еще неправильно. Microsoft знает, как URL Encode вообще? Есть ли функция, которую кто-то написал, чтобы сделать это правильно?

EDIT:

Я написал свой собственный кодер:

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%20page

Но, хотя это выглядит как хороший действительный URL-адрес, IIS все же дает мне

Ошибка HTTP 400.0 - неверный запрос ASP.NET обнаружил недопустимые символы в URL.

1 Ответ

6 голосов
/ 05 января 2011

ОК, отвечая на мой собственный вопрос ... ненавижу это делать, но я получил ответ после долгих копаний.

http://www.lostechies.com/blogs/joshuaflanagan/archive/2009/04/27/asp-net-400-bad-request-with-restricted-characters.aspx

Короче говоря, Microsoft во всей своей красе решила снова не придерживаться международного стандарта.

%, &, * или: не могут быть в URL, закодированы или декодированы до a? по любой причине.

Чтобы обойти это, я написал свой собственный код и декодировать:

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, но пока работает.

...