2013-04-02 8 views
5

Ich habe eine URL wie folgt: http://localhost:8080/search.json?q=L%u00e6r, die die codierte Suche nach Lær ist.WebRequest.Create falsch entschlüsselt url

Leider erstellt eine WebRequest von dieser URL mit WebRequest.Create(url) die folgende URL: http://localhost:8080/search.json?q=L%25u00e6r.

Beachten Sie, dass es %u00e6 falsch dekodiert und %25u00e6r produziert. Gibt es eine Möglichkeit, diese Art von Unicode-Escape-Wert entweder zu konvertieren oder WebRequest.Create zu erhalten, damit es korrekt behandelt wird?

Dies sollte höchstwahrscheinlich als Fehler im .net-Team gemeldet werden. WebRequest.Create() kann die von Request.QueryString.ToString() zurückgegebene Abfragezeichenfolge nicht verwenden, wenn die Abfrage ein §, æ, ø oder å (oder ein anderes nicht-ASCII-Zeichen) enthält. Hier ist eine kleine mvc-Aktion, mit der man es testen kann. Nennen Sie es mit der Abfrage Query?q=L%C3A6r

public ActionResult Query() 
{ 
    var query = Request.QueryString.ToString(); 
    var url = "http://localhost:8080?" + query; 


    var request = WebRequest.Create(url); 
    using (var response = request.GetResponse()) 
    using (var stream = response.GetResponseStream()) 
    { 
     return new FileStreamResult(stream, "text/plain"); 
    } 
} 

bearbeiten:

Leider @ animaonline-Lösung funktioniert nicht mit Urls wie http://localhost:8080/search.json?q=Lek+%26+L%u00e6r, die in http://localhost:8080/search.json?q=Lek & Lær decodiert werden, wo WebRequest.Create über die & verwechselt wird, und denkt, dass es trennt Parameter, anstatt Teil des Parameters zu sein.

+0

Wenn Sie es in ohne Codierung übergeben, doch wäre es für Sie die Codierung tun? – Base33

+0

Ich habe die URL nicht erstellt, sie wurde von Dritten an die Anwendung übergeben. Jetzt muss ich die URL gegen die gleiche dritte Partei verwenden. Es funktioniert im Browser, aber nicht in C# – Marius

+0

Ah okay! Versuchen Sie @ anomeaonline's Lösung, es sieht für mich sehr gut aus! – Base33

Antwort

3

Die Lösung spaltete die Query-String in jede separate Komponente zu sein scheint, es Decodierung und reencoding es dann als UTF-8, bevor sie alle Verbindungs wieder zusammen.

string FixQuery(string query){ 
    return String.Join("&", 
    query.Split(new[] {'&'}) 
     .Select(
     p => 
      String.Join("=", 
      p.Split(new[] {'='}) 
       .Select(
       q => 
        HttpUtility.UrlEncode(
        HttpUtility.UrlDecode(q), 
        Encoding.UTF8 
       ) 
      ) 
     ) 
    ) 
); 
} 

//example usage 

var url = "http://localhost:8080/search?"+FixQuery(query); 
+0

für Leute mit .NET 3.5, funktioniert diese Lösung, aber Sie müssen den zweiten Parameter zu jedem String.join in Parens und .ToArray() die ganze Sache zu wickeln. – Dan

5

Sie haben Ihre URL zu entschlüsseln, bevor erstellen Ausführen

 var decodedUrl = HttpUtility.UrlDecode("http://localhost:8080/search.json?q=L%u00e6r"); 

     var req = WebRequest.Create(decodedUrl); 
+0

Ich habe die Frage aktualisiert, um zu reflektieren, warum diese Methode leider nicht funktioniert – Marius

+1

Vielleicht sollten Sie dann nur das Argument codieren? -> q? – animaonline