none
Eliminación de caracteres en la clase Uri RRS feed

  • Pregunta

  • Hola a tod@s

    Estoy teniendo un problema con algunas urls que contienen, en la dirección, más de un carácter "." seguido, por ejemplo:
       - http://www.example.com/folder/file_example../filexml.xml

    El caso es que cuando declaro la clase uri con este tipo de urls y compruebo sus propiedades los puntos desaparecen.
    Por ejemplo, la propiedad AbsolutePath que da así: /folder/file_example/filexml.xml lo mismo pasa con la propiedad AbsoluteUri que quedaría así: http://www.example.com/folder/file_example/filexml.xml
    Por tanto, cuando intento recuperar la respuesta de la página me devuelve un 404. (Nota: la página existe)
    Lo mismo me pasa cuando intento hacerlo a través de la función Load de la clase XmlDocument.

    ¿Sabríais decidme porque pasa esto y si es posible solucionarlo?

    ejemplo

                Dim uriUrl As New Uri("http://www.example.com/folder/file_example../filexml.xml")
                Dim myRequest As HttpWebRequest = HttpWebRequest.Create(uriUrl)
                Dim myResponse As HttpWebResponse
                'aquí da el 404
                myResponse = myRequest.GetResponse

    Muchas Gracias
    • Cambiado Enrique M. Montejo viernes, 15 de julio de 2011 17:37 desarrollo web (De:Lenguaje VB.NET)
    jueves, 18 de febrero de 2010 16:19

Todas las respuestas

  • Hola Petaor,

    el problema me parece es porque ./ y ../ tienen un significado particular dentro de las URIs. La documentación de la clase menciona lo siguiente: 

    Las propiedades de Uri devuelven una representación de datos canónica con codificación de escape, [...] el constructor de Uri realiza los pasos siguientes:
    [...]
    * Canoniza la ruta de acceso de los identificadores URI jerárquicos mediante la compactación de secuencias como /./, /../, //, incluidas las representaciones con secuencias de escape
    [...]

    En otras palabras, te dice que el ctor se encargará de transformar ../. Si seguimos leyendo, abajito de eso te dice: 

    Como parte de la canonización en el constructor para algunos esquemas, se compactan las representaciones de escape. [...] Por ejemplo, si se codifica con un símbolo de porcentaje los dos puntos ".." como "%2E%2E", el constructor de URI compactará esta secuencia para algunos esquemas. En el ejemplo de código siguiente se muestra un constructor de URI para el esquema http.

    Uri uri = new Uri("http://myUrl/%2E%2E/%2E%2E");
    Console.WriteLine(uri.AbsoluteUri);
    Console.WriteLine(uri.PathAndQuery);

    Cuando se ejecuta este código, se devuelve el resultado siguiente con la secuencia de escape compactada.

    http://myUrl/
    /
    

    El problema es que se siguen "las especificaciones para los URI [que] figuran en los documentos RFC 2396 y RFC 3986 publicados por el grupo de trabajo de ingeniería de Internet IETF (Internet Engineering Task Force)". En otras palabras, la URI que tú tienes no es estándar y está mal formada. 

    Mi sugerencia sería que cambies el URL. Sé que no es una solución como quisieras, pero estuve investigando y no se me ocurre algo. Una opción, por supuesto, sería que crearas una clase que herede de System.Uri y encontrases algo que pudieras sobreescribir. Estuve revisando con Reflector para ver cómo funciona WebRequest.Create, y lo más que pude ver era que obtenía Uri.AbsoluteUri. Desgraciadamete esta propiedad no es virtual, por lo que no podrías sobreescribirla.

    En fin, a ver si se me ocurre algo más, o alguien del foro tenga otra idea. 

    Saludos. 






    Fernando Gómez
    www.fermasmas.com
    jueves, 18 de febrero de 2010 18:14
  • Totalmente de acuerdo, yo tambien he estado probando con %2e, y efectivamente "no cuela". La URI está mal formada. De hecho nunca he visto (tampoco es que me haya fijado especialmente) una URL con dos puntos consecutivos (ojo!, URI y URL son parecidos, pero diferentes)
    jueves, 18 de febrero de 2010 18:22
  • Muchas gracias por la información, estaba convencido que era porque la url estaba mal formada y por eso lo descartaba pero no sabía muy bien el porqué, ahora ya lo tengo claro.
    Ya intente heredar esa clase pero, como dices, no se puede sobreescribir de ninguna manera.
    Veré que se puede hacer porque no tengo posibilidad de cambiar la url, ya que no depende de mi.
    No obstante, muchas gracias, de nuevo.
    martes, 23 de febrero de 2010 16:24