2011-09-05 7 views
7

Supongamos que quiero crear un objeto Uri de la siguiente cadena:Creación de un Uri en .NET urldecodes automáticamente todos los parámetros de cadena pasada

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

resultado esperado sería:

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

Obtenido:

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

El mismo comportamiento se nota en muchos métodos relacionados que permiten la creación de Uri: Uri.TryCreate, UriBuilder.Uri, etc.

¿Cómo obtendré un Uri que conserve el parámetro codificado inicial?

+0

Resultado esperado de hacer qué? Si pruebo su código en una aplicación de consola 'Console.WriteLine (uri.AbsoluteUri);' devuelve la url codificada –

+1

Para otras búsquedas relacionadas con esto. En realidad, es el método ToString() que decodifica la cadena. .OriginalString o .AbsoluteUri devolverá la cadena codificada. Para una URL relativa, use .PathAndQuery – jishi

Respuesta

3

Este comportamiento es documented:

Como parte de canonización en el constructor para algunos esquemas, escaparon representaciones se compactan. Los esquemas para los cuales URI se compactas secuencias escapadas incluyen lo siguiente: archivo, http, https, net.pipe y net.tcp. Para todos los demás esquemas, las secuencias escapadas son no compactadas. Por ejemplo: si el porcentaje codifica los dos puntos "..." como "% 2E% 2E", el constructor de URI compactará esta secuencia para algunos esquemas . Por ejemplo, el siguiente ejemplo de código muestra un constructor URI para el esquema http.

Así que una solución podría ser utilizar temporalmente un esquema personalizado (por ejemplo leavemealone://) para construir los objetos URL (posiblemente a través UriBuilder?).

4

¿Cómo obtuviste la URL? Si cierro el mouse sobre él en Visual Studio, de hecho muestra la URL decodificada.

Pero siempre que lo acceda a través de la propiedad AbsoluteUri, muestra la URL codificada.

+0

Bueno, estoy describiendo el comportamiento observado. Es una aplicación asp.net mvc pero no importa. –

+0

No pregunté qué, le pregunté cómo. – CodeCaster

+0

ooops lo siento. Me formé utilizando enrutamiento asp.net mvc, pero tengo que hacer algunas modificaciones. –

0

En mi caso, lo resolví devolviendo el método ToString() de la clase UriBuilder en lugar de usar la propiedad Uri de la misma clase.

4

En .NET4 puede desactivar Uri compactación para cierto esquema via a configuration:

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

Tenga en cuenta que hay implicaciones de seguridad relacionadas con la desactivación del comportamiento predeterminado.

Cuestiones relacionadas