JASoft.org

El blog de José Manuel Alarcón Aguín. Programación web y mucho más...

MENÚ - JASoft: JM Alarcón

Cómo obtener rutas absolutas en ASP.NET

RutaHoy un truco rápido.

En ASP.NET a veces necesitamos convertir rutas relativas (por ejemplo guardadas en una base de datos) a rutas absolutas para poder referenciar archivos para descarga, imágenes, etc...

Estas rutas pueden venir dadas de diversas formas. Por ejemplo, todas estas son rutas válidas:

  • "/Docs/doc.pdf": se refiere a la raíz absoluta del servidor, es decir desde el nombre de dominio en adelante.
  • "../Img/image.jpg": ruta relativa a la página actual, un directorio por encima.
  • "./files/features.js": se refiere a una ruta dentro de la carpeta que contiene a la página actual.
  • "~/CSS/styles.css": ruta relativa a la raíz de la aplicación, que no tiene porqué coincidir con la raíz del servidor ya que puede que nuestra app cuelgue de una carpeta virtual, por ejemplo. Esto es algo que no siempre es tenido en cuenta.

Y hay más combinaciones posibles, como por ejemplo el uso de los ../ por el medio de la propia ruta, etc...

A veces con esto es suficiente porque el dato que tenemos almacenado se refiere a la página actual, pero no necesariamente es siempre así y nos vendrá bien convertirlo en una ruta absoluta, que incluya el nombre del servidor, el puerto, el protocolo, etc...

Sería relativamente fácil crear una función que tuviera en cuenta todas las casuísticas y nos transformara la cadena en una ruta absoluta, pero por suerte ASP.NET ya trae de serie una funcionalidad así.

Recientemente me encontré con esta necesidad a la hora de transformar rutas que en su mayoría comenzaban con el carácter especial "~" que marca el directorio raíz de la aplicación. En este caso es especialmente importante transformar la ruta ya que esta notación sólo es entendida por ASP.NET y si le ponemos una ruta así a algo que enviemos al navegador, éste no sabrá interpretarlo.

¿Cuál es el código que utilicé?. El siguiente:

   1: public string ConvertRelativeUrlToAbsoluteUrl(string relativeUrl)
   2: {
   3:     if (Request.IsSecureConnection)
   4:         return string.Format("https://{0}{1}{2}", Request.Url.Host, 
   5:             Request.Url.Port == 80 ? "" : ":" + Request.Url.Port.ToString(), 
   6:             Page.ResolveUrl(relativeUrl));
   7:     else
   8:         return string.Format("http://{0}{1}{2}", Request.Url.Host,
   9:             Request.Url.Port == 80 ? "" : ":" + Request.Url.Port.ToString(),
  10:             Page.ResolveUrl(relativeUrl));
  11: }

Como puedes ver es muy sencillo, pero tiene en cuenta si la URL es segura o no (con SSL), si el puerto utilizado es el estándar (80) o no, etc...

¡Espero que te resulte útil!

José Manuel Alarcón José Manuel Alarcón
Fundador y director de campusMVP.es, el proyecto de referencia en formación on-line para programadores en lengua española. Autor de varios libros y cientos de artículos. Galardonado como MVP de Microsoft desde 2004. Gallego de Vigo, amante de la ciencia y la tecnología, la música y la lectura. Ayudando a la gente en Internet desde 1996.
Descarga GRATIS mi último libro (no técnico): "Tres Monos, Diez Minutos".
Banner

Agregar comentario