2013-04-02 22 views
5

Ho una url come questa: http://localhost:8080/search.json?q=L%u00e6r, che è la ricerca codificata di Lær.WebRequest.Create decodifica impropriamente l'URL

Sfortunatamente la creazione di una richiesta Web da questo URL utilizzando WebRequest.Create(url) produce il seguente URL: http://localhost:8080/search.json?q=L%25u00e6r.

Si noti che decodifica in modo errato %u00e6 e produce %25u00e6r. Esiste un modo per convertire questo tipo di valore di escape unicode o ottenere WebRequest.Create per gestirlo correttamente?

Questo dovrebbe molto probabilmente essere segnalato come un bug al team .net. WebRequest.Create() non può utilizzare la stringa di query restituita da Request.QueryString.ToString() se la query contiene un §, æ, ø o å (o qualsiasi altro carattere non-ascii). Ecco una piccola azione in mvc che può essere utilizzata per testarlo. Chiamatelo con la query 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"); 
    } 
} 

Edit:

Purtroppo @ soluzione animaonline non funziona con gli URL come http://localhost:8080/search.json?q=Lek+%26+L%u00e6r, che vengono decodificati in http://localhost:8080/search.json?q=Lek & Lær, dove WebRequest.Create ottiene confuso circa la &, e pensa che separa i parametri, anziché essere parte del parametro q.

+0

Se lo si passa senza codifica, sicuramente farebbe la codifica per te? – Base33

+0

Non ho creato l'url, è stato dato all'applicazione da una terza parte. Ora ho bisogno di usare l'url contro la stessa terza parte. Funziona nel browser, ma non in C# – Marius

+0

Ah okay! Prova la soluzione di @ anomeaonline, mi sembra davvero buona! – Base33

risposta

3

La soluzione sembra essere quella di dividere la stringa di query in ciascun componente separato, la decodifica e poi ricodificarli come UTF-8, prima di entrare in tutto ancora insieme.

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

per chi usa .NET 3.5, questa soluzione funziona ma devi avvolgere il secondo parametro su ogni stringa. Entra in parens e .ToArray() l'intera cosa. – Dan

5

si deve decodificare l'URL prima di eseguire Creare

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

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

Ho aggiornato la domanda per riflettere perché, sfortunatamente, questo metodo non funziona – Marius

+1

Forse dovresti codificare l'argomento? -> q? – animaonline