2009-12-09 13 views
5
Dim x AS New URI("http://www.example.com/test//test.asp") 
Dim rel AS New URI("http://www.example.com/xxx/xxx.asp") 
Console.Writeline(x.MakeRelativeUri(rel).Tostring()) 

Aquí salida es:Normalización URI para hacer que funcione correctamente con MakeRelativeUri

../../xxx/xxx.asp 

que parece correcta casi todos los servidores web procesarán los dos de los siguientes como misma petición:

http://www.example.com/test//test.asp 
http://www.example.com/test/test.asp 

¿Cuál es la mejor manera de corregir este comportamiento si hay alguna API para hacer esto, o crear manualmente un nuevo URI y eliminar todo // en la ruta?

Respuesta

4

Parece que reemplazar todas las barras diagonales con una barra en la parte de LocalPath es la mejor solución. IIS lo hace incluso cuando pasa URL a ASP.net.

El siguiente código hará el truco.

x = new Uri(string.Format("{0}://{1}:{2}{3}{4}", x.Scheme, x.Host, x.Port, Regex.Replace(x.LocalPath, @"(?<!\:)/{2,}", "/"), x.Query)); 
0

En primer lugar, su código no es C# sino VB, por lo que las etiquetas son incorrectas.

¿Puede usar este código en su lugar, que proporciona la URL "correcta" ya que // están en el baseuri y se descartarán?

var x2 = new Uri(x, rel); 

¿O es importante obtener el ../ retroceso en la url?

La función MakeRelativeUri se corrige de acuerdo con el RFC, pero falla según la convención normal. Le sugiero que normalice la URL usted mismo, o use mi ejemplo anterior si es posible.

x = new Uri(Regex.Replace(x.OriginalString, "[^:]//", "/")); 
+0

Ese código es truco muy cruda, ya que no va a funcionar en varios escenarios, el más obvio http://example.com/test///xxx en segundo lugar a pesar de que no está muy bien codificado esto es un alambique URI válido: http://example.com/?bla=//Whatup –

+0

Dr.Evil: una URL válida depende en gran medida del servidor web que la interpreta, y qué tan sólida ha decidido ser al analizar las URL. Como el marco no hace toda la limpieza como lo desea, cree usted mismo una función "makerelativeurl" que verifique y limpie las barras de forma adecuada. ¿Debería seguir el RFC o manejar casos donde el URL es claramente incorrecto? .) –

Cuestiones relacionadas