2012-02-16 15 views
14

¿Cómo se codifica correctamente una ruta que incluye un hash (#) en él? Tenga en cuenta que el hash no es el indicador de fragmento (marcador?) Sino parte del nombre de ruta.Cómo codificar una ruta que contiene un hash?

Por ejemplo, si hay un camino como éste:

http://www.contoso.com/code/c#/somecode.cs

que causa problemas cuando, por ejemplo, tratar de hacer esto:

Uri myUri = new Uri("http://www.contoso.com/code/c#/somecode.cs"); 

Parecería que interpreta el hash como el indicador de fragmento.

Se siente mal reemplazar manualmente # con% 23. ¿Hay otros personajes que deberían ser reemplazados? Hay algunos métodos de escape en Uri y HttpUtility, pero ninguno parece ser el truco.

Respuesta

3

hicimos un poco más amigos que cavan y se encontró una pregunta duplicada para Java: HTTP URL Address Encoding in Java

Sin embargo, la clase .NET Uri no ofrece el constructor que necesitamos, pero el UriBuilder sí lo tiene.

Por lo tanto, con el fin de construir un URI apropiado en la ruta contiene caracteres no válidos, haga lo siguiente:

// Build Uri by explicitly specifying the constituent parts. This way, the hash is not confused with fragment identifier 
UriBuilder uriBuilder = new UriBuilder("http", "www.contoso.com", 80, "/code/c#/somecode.cs"); 

Debug.WriteLine(uriBuilder.Uri); 
// This outputs: http://www.contoso.com/code/c%23/somecode.cs 

Aviso cómo lo hace no innecesariamente escapar partes de la URI que no necesitan escapar (al igual the: // part) que es el caso con HttpUtility.UrlEncode. Parecería que el propósito de esta clase es codificar la parte querystring/fragment de la URL, no el esquema ni el nombre de host.

1

Uso UrlEncode: System.Web.HttpUtility.UrlEncode(string)

class Program 
{ 
    static void Main(string[] args) 
    { 
     string url = "http://www.contoso.com/code/c#/somecode.cs"; 
     string enc = HttpUtility.UrlEncode(url); 

     Console.WriteLine("Original: {0} ... Encoded {1}", url, enc); 
     Console.ReadLine(); 
    } 
} 
+0

La cadena enc en el ejemplo, aunque escapó, ya no es un URI válido. Pruebe Uri uri = new Uri (enc) y verá que arroja una excepción de URI no válida. Encontré la solución correcta sin embargo. – Dodgyrabbit

+0

Interesante. Estoy un poco confundido por la documentación de MSDN, que dice _Encodes una cadena de URL. El método UrlEncode se puede utilizar para codificar la URL completa, incluidos los valores de la cadena de consulta._ (consulte http://msdn.microsoft.com/en-us/library/system.web.httputility.urlencode.aspx) – LiquidPony

3

Hay algunos caracteres que no se supone que utilice. Puede intentar work your way through this very dry documentation, o consultar este handy URL summary on Stack Overflow.

Si visita este mismo sitio web, verá que sus preguntas C# están codificadas %23.

Stack Overflow C# Questions

Usted puede hacer esto utilizando (para ASP.NET):

string.Format("http://www.contoso.com/code/{0}/somecode.cs", 
    Server.UrlEncode("c#") 
); 

O para las bibliotecas de clases/escritorio:

string.Format("http://www.contoso.com/code/{0}/somecode.cs", 
    HttpUtility.UrlEncode("c#") 
); 
+0

Enlace agradable .. C# sin codificación! ¡Buen truco! –

+0

Tenga en cuenta que la codificación de la URL completa de esta manera (incluidos el esquema y la ruta) en realidad produce una cadena que no es un URI válido. Lanza el URI no válido: no se pudo determinar el formato del URI si intentas construir un URI a partir de él. – Dodgyrabbit

+0

Sí, bastante - ejemplos actualizados. – Fenton

Cuestiones relacionadas