2011-01-05 1 views
6

Почему следующие адреса дают мне ошибки IIS ниже:Получение ошибки 400/404 - HttpUtility.UrlEncode не кодирует полную строку?

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

А2) http://192.168.1.96/cms/View.aspx/Show/Small%20test' < - это работает, но это не результат от HttpUtility.UrlEncode()

B) http://192.168.1.96/cms/View.aspx/Show/ '% 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. Но В конце концов, выглядит как:

http://192.168.1.96/TVCMS-CVJZ/cms/View.aspx/Show/ '& $ # фанки ** !! ~' '% 20page

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

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-адресе.

+0

B, похоже, полностью не устарел. – marcog

+0

@marcog - это то, о чем я тоже думал, но его результат дает: PageID = HttpUtility.UrlEncode (PageID); где PageID = "'& $ # funky ** !! ~' 'page" – Justin808

+0

'% 27% 26% 24% 23funky% 2A% 2A% 21% 21% 7E% 27% 27% 20page' то, что должно быть , Я понятия не имею, что может заставить его не работать. – marcog

ответ

6

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

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

Длинные и короткие его является 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 дружественного на данный момент, но сейчас он работает.