Cambio en ParentPaths (Server.MapPath) en IIS 6

¿Cómo utilizar Server.MapPath en IIS 6?

Hasta la versión 5, IIS (Internet Information Services) se instalaba con Parent Paths (rutas primarias) habilitadas (propiedad AspEnableParentPaths = True) lo que permitía utilizar en ASP .NET el método Server.MapPath (de la clase HttpServerUtility) para obtener la ruta virtual al directorio físico de la aplicación web. Por ejemplo:

Private ruta As String = Server.MapPath("....BD/empresas.mdb")

era una construcción válida si el archivo empresas.mdb estaba situado en una carpeta BD que se encontraba 2 niveles por arriba del directorio de la aplicación web.

Pero a partir de la versión 6 y por motivos de seguridad, IIS se instala con Parent Paths deshabilitadas por defecto (propiedad AspEnableParentPaths = False), lo que provoca errores en ASP .NET cuando el código contiene Server.MapPath.

Para solucionarlo hay 2 posibilidades: habilitar Parent Paths en IIS o utilizar otras clases de ASP .NET.

Para habilitar Parent Paths en IIS: botón derecho sobre el sitio web en la herramienta de administración – Propiedades (Properties) – Directorio principal (Home directory) – Configuración (Configuration) – Opciones (Options) – Habilitar Rutas Primarias (Enable Parent Paths).

Si no queremos modificar la configuración de IIS para mantener el nivel de seguridad, podemos emplear otras clases de ASP .NET para obtener la ruta deseada:

  • System.IO.FileInfo permite obtener o definir atributos de archivos y carpetas
  • System.IO.Path.Combine devuelve una ruta válida combinando 2 cadenas diferentes
  • Directory.GetParent devuelve el directorio principal de la ruta especificada.

En el ejemplo anterior podríamos conocer la ruta virtual del archivo empresas.mdb con uno de estos 3 códigos de ejemplo:

Private ruta As String = New System.IO.FileInfo(System.IO.Path.Combine(Server.MapPath("/"), "....BDempresas.mdb")).FullName

Private ruta As String = System.IO.Path.Combine(Directory.GetParent(Server.MapPath("")).FullName, "..BDempresas.mdb")

Private ruta As String = System.IO.Path.Combine(Directory.GetParent(Server.MapPath("")).FullName, "..") + "BDempresas.mdb"

2 comentarios en «Cambio en ParentPaths (Server.MapPath) en IIS 6»

  1. Gracias por la información, así queda aclarado para complementar el texto del artículo.

  2. Hay que tener en cuenta que ésto sólo sucede cuando se utiliza IIS, si solamente usas Visual Studio y su propio servidor web para probar aplicaciones ASP .NET no tendrás ese error porque parent paths está activo y has de probarlo también desde servidor IIS para comprobar si funciona bien o no.

Los comentarios están cerrados.