Esta entrada gira alrededor de IIS 6.0, pero los conceptos también se pueden aplicar a IIS 7.0.
Hay un error muy conocido cuando publicamos una aplicación ASP.NET a IIS:
It is an error to use a section registered as allowDefinition=’MachineToApplication’ beyond application level. This error can be caused by a virtual directory not being configured as an application in IIS.
Si deseamos publicar una aplicación Web ASP.NET sobre IIS 6.0 en Windows Server 2003, debes poder diferenciar tres conceptos: Web Site, Virtual Directory, y Application. Estos términos no los traduciré en los siguientes párrafos, para no generar confusión en la definición de los mismos.
Web Site: Es la ruta base de una aplicación Web, y que se corresponde con un nombre de dominio o una ip de red: http://sergiot2.com, o http://servidorInformes. Por ejemplo, si estamos desarrollando un portal de reportes, y después de publicar nuestra aplicación tenemos que acceder así: http://serv2010/Reportes/, es por que no la hemos publicado a nivel de Web Site. Si la publicamos a nivel de Web Site, debemos poder acceder a la aplicación sólo ingresando la ruta: http://serv2010/. Mas claro el concepto de Web Site?
En IIS podemos tener múltiples Web Sites, y que básicamente se pueden diferenciar por el puerto usado y la carpeta. Por ejemplo, cuando se instala IIS crea un Default Web Site, que apunta a: C:inetpubwwwroot, y apunta al puerto 80. Cuando instalamos SharePoint, este crear varios Web Site, que usan otros puertos, dependiendo de la configuración seleccionada. Otro es caso en la instalación de Reporting Services, que por defecto se instala sólo como un Application dentro de un Web Site.
Virtual Directory: Un “directorio virtual” sirve para mapear una subdirección de un Web Site a otra carpeta. Imaginen que un Web Site de venta de autos, http://crediAutos.com/ alojado en “C:inetpubwwwroot”, que desea usar las imágenes que están en otro disco duro: “F:imageAutos”, si deseamos cargar las imágenes en la siguiente ruta: http://crediAutos.com/images sin mover los archivos físicos, es ahí cuando podemos crear un Virtual Directory dentro del Web Site. Veamos la configuración del siguiente ejemplo:
Y si lo vemos en el navegador:
Si colocamos páginas aspx dentro de un Virtual Directory, funcionará siempre y cuando y no tenga un archivo web.config con elementos de aplicación, por llamarlo así. Por ejemplo dentro de un Virtual Directory, que es un sub-directorio de nuestro Web Site, podemos colocar un archivo web.config con el elemento authorization, como se menciona en esta entrada. Pero no podemos colocar un elemento Authentication dentro de un web.config de un Virtual Directoty, debido a que este elemento sólo se permite a nivel de aplicación. De ahí el problema origen.
Si queremos que nuestro Virtual Directory se comporte como una aplicación aparte, es decir tenga un web.config con el elemento Authentication, para poder manejar su propia autenticación distinta al Web Site base, debemos convertir este Virtual Directory en un ASP.NET Application.
Application: También podemos llamarlo ASP.NET Application, y se crea de la misma forma que un Virtual Directory, pero con la diferencia de que si puede comportarse como una aplicación ASP.NET independiente, es decir puede tener su propio Application Pool, puede tener su propia versión de ASP.NET y el web.config permite elementos de aplicación como el famoso Authentication del error inicial. Se pueden crear varios ASP.NET Applications dentro de un Web Site, como se muestra en la siguiente figura:
Caso de la Vida Real: Un amigo X tenía el problema mencionado al inicio, cuando publico su aplicación ASP.NET en el hosting de otro amigo dueño, por cierto el hosting en mención es dattatec.com. Digamos que el dueño del hosting tenía su aplicación ASP.NET a nivel del Web Site del IIS, es decir: http://todoautos.com.pe, el amigo del dueño tenía una aplicación ASP.NET que quería probar, entonces publico su aplicación como un subdirectorio para no afectar la aplicación del dueño. Pero no funcionaba ninguna aspx, debido al error mencionado arriba. Dentro del panel de control de dattatec (dentro de lo que pude revisar a simple vista) sólo se podía convertir la carpeta del amigo invitado en un Virtual Directory, pero no había ninguna opción para convertirlo en un ASP.NET Application, y seguía el famoso problema del inicio.
La solución pasaría, si es que no hay una opción en el panel del control, mandar un correo al proveedor para que cree el Application manualmente, debe haber un administrador que monitorea los servidores no?.
Consejo: cuando renten un hosting, validen si se pueden crear muchos Virtual Directory y ASP.NET Application, pregunten por los dos por si ellos no tienen claro la diferencia entre los mismos.
Por cierto, un proveedor de hosting no tendría sentido habilitar la creación de Virtual Directory, porque no es lógico que administren carpetas en distintas ubicaciones para el mismo usuario, ¿será que pensaron que una aplicación ASP.NET podía correr en un Virtual Directory? Bueno si alguien tiene su hosting en Dattatec.com, y sabe más del tema, lo comenta por favor.
Lecturas complementarias:
Saludos,