2011-09-05 6 views
7

Supponiamo che io voglio creare un oggetto Uri dalla seguente stringa:Creazione di un URI in .NET urldecodes automaticamente tutti i parametri di stringa passata

string url = @"http://someserver.com?param1=1&url=http%3a%2f%2fwww.otherserver.com"; 
Uri uri = new Uri(url, UriKind.Absolute); 

Risultato atteso sarebbe:

http://someserver.com?param1=1&url=http%3a%2f%2fwww.otherserver.com 

Ottenuto:

http://someserver.com/?param1=1&url=http://www.otherserver.com 

Lo stesso comportamento si nota in molti metodi correlati che permettono la creazione Uri: Uri.TryCreate, UriBuilder.Uri, ecc.

Come ottengo un Uri che conserva il parametro codificato iniziale?

+0

Risultato previsto di fare cosa? Se provo il tuo codice in un'applicazione Console 'Console.WriteLine (uri.AbsoluteUri);' restituisce l'url codificato –

+1

Per altre ricerche su questo. In realtà è il metodo ToString() che decodifica la stringa. .OriginalString o .AbsoluteUri restituirà la stringa codificata. Per un url relativo, utilizzare .PathAndQuery – jishi

risposta

3

Questo comportamento è documented:

Come parte della canonica nel costruttore per alcuni schemi, sfuggito rappresentazioni sono compattati. Gli schemi per i quali l'URI comporterà sequenze di escape compatte includono: file, http, https, net.pipe e net.tcp. Per tutti gli altri schemi, le sequenze di escape sono non compattate. Ad esempio: se si codifica per cento i due punti ".." come "% 2E% 2E", il costruttore URI comprimerà questa sequenza per alcuni schemi . Ad esempio, il seguente esempio di codice mostra un costruttore URI per lo schema http.

Così una soluzione potrebbe essere temporaneamente utilizzando uno schema personalizzato (ad esempio leavemealone://) per costruire gli oggetti URL (possibilmente attraverso UriBuilder?).

4

Come hai "ottenuto" l'URL? Se passo il mouse sopra di esso in Visual Studio, in effetti mostra l'URL decodificato.

Ma ogni volta che accedo tramite la proprietà AbsoluteUri, mostra l'URL codificato.

+0

Bene, sto descrivendo il comportamento osservato. È un'app mvc asp.net ma non importa. –

+0

Non ho chiesto cosa, ho chiesto come. – CodeCaster

+0

ooops spiacente. Mi sono formato usando il routing di asp.net mvc ma ho bisogno di fare qualche tweek. –

0

Nel mio caso l'ho risolto restituendo il metodo ToString() della classe UriBuilder invece di utilizzare la proprietà Uri della stessa classe.

4

In .NET4 è possibile disabilitare Uri compattazione per certo schema via a configuration:

<configuration> 
    <uri> 
    <schemeSettings> 
     <add name="http" genericUriParserOptions="DontUnescapePathDotsAndSlashes"/> 
    </schemeSettings> 
    </uri> 
</configuration> 

noti che ci sono implicazioni di sicurezza legate alla disattivazione del comportamento predefinito.

Problemi correlati