2011-01-05 7 views
6

Warum geben die folgenden URLs mir die IIS-Fehler unter:Fehler 400/404 - HttpUtility.UrlEncode nicht vollständige Zeichenfolge codiert?

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

A2) http://192.168.1.96/cms/View.aspx/Show/Small%20test' < - das funktioniert, aber ist nicht das Ergebnis von HttpUtility.UrlEncode()

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

Fehler für A:

HTTP Error 404.11 - Not Found 
The request filtering module is configured to deny a request that contains a double escape sequence. 

Fehler für B:

HTTP Error 400.0 - Bad Request 
ASP.NET detected invalid characters in the URL. 

Der letzte Teil der URL nach/Show/ist das Ergebnis, nachdem der Text durch HttpUtility.UrlEncode gesendet wird() so laut Microsoft ist es URL richtig kodiert.

Wenn ich HttpUtility.UrlPathEncode() statt HttpUtility.UrlEncode() benutze, bekomme ich die A2-Ergebnisse. Aber B endet aussehen wie:

http://192.168.1.96/TVCMS-CVJZ/cms/View.aspx/Show/ '& $ # flippige ** !! ~' '% 20page

die noch ist falsch. Kann Microsoft die URL überhaupt verschlüsseln? Gibt es eine Funktion, die jemand geschrieben hat, um es richtig zu machen?

EDIT:

ich meine eigenen Encoder geschrieben habe:

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; 
} 

Die Funktion arbeitet mit A2 oben ganz gut das Ergebnis für B ist:

http://192.168.1.96/cms/View.aspx/Show/%27%26%24%23funky%2A%2A%21%21~%27%27%20page

Aber auch wenn das wie eine schöne gültige URL aussieht IIS immer noch gibt mir eine

HTTP-Fehler 400.0 - ungültige Anforderung ASP.NET erkannte ungültige Zeichen in der URL.

+0

B scheint nicht vollständig urlencodiert zu sein. – marcog

+0

@marcog - das ist, was ich auch dachte, aber das Ergebnis ergibt sich aus: PageID = HttpUtility.UrlEncode (PageID); where PageID = "'& $ # funky ** !! ~' 'Seite" – Justin808

+0

'% 27% 26% 24% 23funky% 2A% 2A% 21% 21% 7E% 27% 27% 20Seite' ist, was es sein sollte . Ich habe keine Ahnung, was dazu führen könnte, dass es nicht funktioniert. – marcog

Antwort

6

OK, beantworte meine eigene Frage ... hasse es, aber ich habe die Antwort nach viel graben.

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

Die lange und kurze davon ist die Microsoft in seiner ganzen Pracht beschlossen, nicht zu einem internationalen Standard zu halten, wieder.

%, &, *, oder: kann nicht in einer URL sein, codiert oder vor einer decodiert werden? aus irgendeinem Grund.

Um dies zu umgehen ich meine eigene Codierung und Decodierung geschrieben haben:

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); 
} 

Keine der Funktionen freundlich im Moment Unicode sind, aber es funktioniert jetzt.