Usar ASP.NET MVC con distintas versiones de IIS (VB)

por Microsoft

En este tutorial, aprenderá a usar ASP.NET MVC, y el enrutamiento de direcciones URL, con diferentes versiones de Internet Information Services. Aprenderá diferentes estrategias para usar ASP.NET MVC con IIS 7.0 (modo clásico), IIS 6.0 y versiones anteriores de IIS.

El marco ASP.NET MVC depende del enrutamiento de ASP.NET para enrutar las solicitudes del explorador a las acciones del controlador. Para usar el enrutamiento de ASP.NET, es posible que tenga que realizar pasos de configuración adicionales en el servidor web. Todo depende de la versión de Internet Information Services (IIS) y del modo de procesamiento de solicitudes de la aplicación.

Este es un resumen de las distintas versiones de IIS:

  • IIS 7.0 (modo integrado): no hay una configuración especial necesaria para usar el enrutamiento de ASP.NET.
  • IIS 7.0 (modo clásico): debe realizar una configuración especial para usar el enrutamiento de ASP.NET.
  • IIS 6.0 o posterior: debe realizar una configuración especial para usar el enrutamiento de ASP.NET.

La versión más reciente de IIS es la 7.5 (en Win7). IIS 7 de IIS se incluye con Windows Server 2008 Y VISTA/SP1 y versiones posteriores. También puede instalar IIS 7.0 en cualquier versión del sistema operativo Vista, excepto Home Basic (consulte https://technet.microsoft.com/library/cc731179%28WS.10%29.aspx).

IIS 7.0 admite dos modos de procesamiento de solicitudes. Puede usar el modo integrado o el modo clásico. No es necesario realizar ningún paso de configuración especial al usar IIS 7.0 en modo integrado. Sin embargo, debe realizar una configuración adicional al usar IIS 7.0 en modo clásico.

Microsoft Windows Server 2003 incluye IIS 6.0. No se puede actualizar IIS 6.0 a IIS 7.0 al usar el sistema operativo Windows Server 2003. Debe realizar pasos de configuración adicionales al usar IIS 6.0.

Microsoft Windows XP Professional incluye IIS 5.1. Debe realizar pasos de configuración adicionales al usar IIS 5.1.

Por último, Microsoft Windows 2000 y Microsoft Windows 2000 Professional incluyen IIS 5.0. Debe realizar pasos de configuración adicionales al usar IIS 5.0.

Modo clásico frente a integrado

IIS 7.0 puede procesar solicitudes mediante dos modos de procesamiento de solicitudes diferentes: clásico e integrado. El modo integrado proporciona mejor rendimiento y más características. El modo clásico se incluye para la compatibilidad con versiones anteriores de IIS.

El modo de procesamiento de solicitudes viene determinado por el grupo de aplicaciones. Puede determinar qué modo de procesamiento usa una aplicación web concreta determinando el grupo de aplicaciones asociado a la aplicación. Siga estos pasos:

  1. Inicio del Administrador de Internet Information Services.
  2. En la ventana Conexiones, seleccione una aplicación.
  3. En la ventana Acciones, haga clic en el vínculo Configuración básica para abrir el cuadro de diálogo Editar aplicación (vea la figura 1)
  4. Anote el grupo de aplicaciones seleccionado.

De forma predeterminada, IIS está configurado para admitir dos grupos de aplicaciones: DefaultAppPool y Classic .NET AppPool. Si se selecciona DefaultAppPool, la aplicación se ejecuta en modo de procesamiento de solicitudes integrado. Si se selecciona Classic .NET AppPool, la aplicación se ejecuta en modo de procesamiento de solicitudes clásico.

Screenshot of the Edit Application dialog box, which is showing that IIS is configured to run the application in integrated request processing mode.

Figura 1: Detección del modo de procesamiento de solicitudes (haga clic para ver la imagen a tamaño completo)

Observe que puede modificar el modo de procesamiento de solicitudes en el cuadro de diálogo Editar aplicación. Haga clic en el botón Seleccionar y cambie el grupo de aplicaciones asociado a la aplicación. Tenga en cuenta que hay problemas de compatibilidad al cambiar una aplicación ASP.NET del modo clásico al integrado. Para más información, consulte los siguientes artículos.

Si una aplicación ASP.NET usa DefaultAppPool, no es necesario realizar ningún paso adicional para que funcione el enrutamiento de ASP.NET (y, por tanto, ASP.NET MVC). Sin embargo, si la aplicación ASP.NET está configurada para usar Classic .NET AppPool, siga leyendo, ya que tendrá más trabajo que hacer.

Uso de ASP.NET MVC con versiones antiguas de IIS

Si necesita usar ASP.NET MVC con una versión de IIS anterior a IIS 7.0 o necesita usar IIS 7.0 en modo clásico, tiene dos opciones. Primero, puede modificar la tabla de rutas para usar extensiones de archivo. Por ejemplo, en lugar de solicitar una dirección URL como /Store/Details, solicitaría una dirección URL como /Store.aspx/Details.

La segunda opción consiste en crear algo llamado asignación de scripts comodín. Una asignación de scripts comodín permite asignar todas las solicitudes al marco ASP.NET.

Si no tiene acceso al servidor web (por ejemplo, la aplicación ASP.NET MVC está hospedada por un proveedor de servicios de Internet), deberá usar la primera opción. Si no desea modificar la apariencia de las direcciones URL y tiene acceso al servidor web, puede usar la segunda opción.

Exploramos cada opción en detalle en las secciones siguientes.

Adición de extensiones a la tabla de rutas

La manera más fácil de conseguir que el enrutamiento de ASP.NET funcione con versiones anteriores de IIS es modificar la tabla de rutas del archivo Global.asax. El archivo Global.asax predeterminado y sin modificar de la lista 1 configura una ruta denominada Default.

Lista 1: Global.asax (sin modificar)

Public Class MvcApplication

        Inherits System.Web.HttpApplication 

        Shared Sub RegisterRoutes(ByVal routes As RouteCollection)

            routes.IgnoreRoute("{resource}.axd/{*pathInfo}") 

            ' MapRoute takes the following parameters, in order:

            ' (1) Route name

            ' (2) URL with parameters

            ' (3) Parameter defaults

            routes.MapRoute( _

                "Default", _

                "{controller}/{action}/{id}", _

                New With {.controller = "Home", .action = "Index", .id = ""} _

            ) 

        End Sub 

        Sub Application_Start()

            RegisterRoutes(RouteTable.Routes)

        End Sub

    End Class

La ruta predeterminada configurada en la lista 1 le permite enrutar las direcciones URL que se parecen a estas:

/Home/Index

/Product/Details/3

/Product

Desafortunadamente, las versiones anteriores de IIS no pasarán estas solicitudes al marco ASP.NET. Por lo tanto, estas solicitudes no se enrutan a un controlador. Por ejemplo, si realiza una solicitud al explorador de la dirección URL /Home/Index, obtendrá la página de error de la figura 2.

Screenshot of the Microsoft Internet Explorer window, which is showing a 404 Not Found error.

Figura 2: Recepción de un error "404 No encontrado" (haga clic para ver la imagen a tamaño completo)

Las versiones anteriores de IIS solo asignan determinadas solicitudes al marco ASP.NET. La solicitud debe ser la de una dirección URL con la extensión de archivo correcta. Por ejemplo, una solicitud de /SomePage.aspx se asigna al marco ASP.NET. Sin embargo, una solicitud de /SomePage.htm no.

Por lo tanto, para que el enrutamiento de ASP.NET funcione, debemos modificar la ruta predeterminada para que incluya una extensión de archivo que se asigne al marco ASP.NET.

Para ello se usa un script llamado registermvc.wsf. Este script se incluyó con la versión 1 de ASP.NET MVC en C:\Program Files\Microsoft ASP.NET\ASP.NET MVC\Scripts, pero a partir de ASP.NET 2 se ha movido a la las características de ASP.NET.

Al ejecutar este script se registra una nueva extensión .mvc con IIS. Después de registrar la extensión .mvc, puede modificar las rutas en el archivo Global.asax para que usen la extensión .mvc.

El archivo Global.asax modificado de la lista 2 funciona con versiones anteriores de IIS.

Lista 2: Global.asax (modificado con extensiones)

Public Class MvcApplication

        Inherits System.Web.HttpApplication 

        Shared Sub RegisterRoutes(ByVal routes As RouteCollection)

            routes.IgnoreRoute("{resource}.axd/{*pathInfo}") 

            ' MapRoute takes the following parameters, in order:

            ' (1) Route name

            ' (2) URL with parameters

            ' (3) Parameter defaults

            routes.MapRoute( _

                "Default", _

                "{controller}.mvc/{action}/{id}", _

                New With {.controller = "Home", .action = "Index", .id = ""} _

            ) 

            routes.MapRoute( _

                "Root", _

                "", _

                New With {.controller = "Home", .action = "Index", .id = ""} _

            ) 

        End Sub 

        Sub Application_Start()

            RegisterRoutes(RouteTable.Routes)

        End Sub

    End Class

Importante: No olvide volver a compilar la aplicación ASP.NET MVC después de cambiar el archivo Global.asax.

Hay dos cambios importantes en el archivo Global.asax de la lista 2. Ahora hay dos rutas definidas en Global.asax. El patrón de dirección URL de la ruta predeterminada, la primera ruta, ahora es así:

{controller}.mvc/{action}/{id}

La adición de la extensión .mvc cambia el tipo de archivos que intercepta el módulo de enrutamiento de ASP.NET. Con este cambio, la aplicación ASP.NET MVC ahora enruta solicitudes como las siguientes:

/Home.mvc/Index/

/Product.mvc/Details/3

/Product.mvc/

La segunda ruta, la ruta raíz, es nueva. Este patrón de dirección URL para la ruta raíz es una cadena vacía. Esta ruta es necesaria para hacer coincidir las solicitudes realizadas con la raíz de la aplicación. Por ejemplo, la ruta raíz coincidirá con una solicitud como esta:

http://www.YourApplication.com/

Después de realizar estas modificaciones en la tabla de rutas, deberá asegurarse de que todos los vínculos de la aplicación sean compatibles con estos nuevos patrones de dirección URL. En otras palabras, asegúrese de que todos los vínculos incluyan la extensión .mvc. Si usa el método auxiliar Html.ActionLink() para generar los vínculos, no debería tener que realizar ningún cambio.

En lugar de usar el script registermvc.wcf, puede agregar manualmente una nueva extensión a IIS que se asigne a la plataforma ASP.NET. Al agregar una nueva extensión por su cuenta, asegúrese de que la casilla Comprobar que existe el archivo no esté activada.

Servidor hospedado

No siempre tiene acceso al servidor web. Por ejemplo, si hospeda la aplicación ASP.NET MVC mediante un proveedor de hospedaje de Internet, no tendrá necesariamente acceso a IIS.

En ese caso, debe usar una de las extensiones de archivo existentes que se asignan al marco ASP.NET. Algunos ejemplos de extensiones de archivo asignadas a ASP.NET incluyen las extensiones .aspx, .axd y .ashx.

Por ejemplo, el archivo Global.asax modificado en la lista 3 usa la extensión .aspx en lugar de la extensión .mvc.

Lista 3: Global.asax (modificado con extensiones de .aspx)

Public Class MvcApplication

        Inherits System.Web.HttpApplication 

        Shared Sub RegisterRoutes(ByVal routes As RouteCollection)

            routes.IgnoreRoute("{resource}.axd/{*pathInfo}") 

            ' MapRoute takes the following parameters, in order:

            ' (1) Route name

            ' (2) URL with parameters

            ' (3) Parameter defaults

            routes.MapRoute( _

                "Default", _

                "{controller}.aspx/{action}/{id}", _

                New With {.controller = "Home", .action = "Index", .id = ""} _

            ) 

            routes.MapRoute( _

                "Root", _

                "", _

                New With {.controller = "Home", .action = "Index", .id = ""} _

            ) 

        End Sub 

        Sub Application_Start()

            RegisterRoutes(RouteTable.Routes)

        End Sub

    End Class

El archivo Global.asax de la lista 3 es exactamente igual que el archivo Global.asax anterior, excepto por el hecho de que usa la extensión .aspx en lugar de la extensión .mvc. No es necesario realizar ninguna configuración en el servidor web remoto para usar la extensión .aspx.

Creación de una asignación de scripts comodín

Si no desea modificar las direcciones URL de la aplicación ASP.NET MVC y tiene acceso al servidor web, tiene una opción adicional. Puede crear una asignación de scripts comodín que asigne al marco ASP.NET todas las solicitudes al servidor web. De este modo, puede usar la tabla de rutas predeterminada de ASP.NET MVC con IIS 7.0 (en modo clásico) o IIS 6.0.

Tenga en cuenta que esta opción hace que IIS intercepte todas las solicitudes realizadas en el servidor web. Esto incluye solicitudes de imágenes, páginas ASP clásicas y páginas HTML. Por lo tanto, habilitar una asignación de scripts comodín en ASP.NET tiene efectos sobre el rendimiento.

Aquí se muestra cómo hacerlo con IIS 7.0:

  1. Seleccione la aplicación en la ventana Conexiones.
  2. Asegúrese de que la vista Características está seleccionada.
  3. Haga doble clic en el botón Asignaciones de controlador.
  4. Haga clic en el vínculo Agregar asignación de scripts comodín (vea la figura 3).
  5. Escriba la ruta de acceso al archivo aspnet_isapi.dll (puede copiar esta ruta de acceso desde la asignación de scripts PageHandlerFactory).
  6. Escriba el nombre MVC.
  7. Haga clic en el botón Aceptar.

Screenshot of the Internet Information Services Manager 7 point 0 window, which is showing the Add Wildcard Script Map dialog box.

Figura 3: Creación de una asignación de scripts comodín con IIS 7.0 (haga clic para ver la imagen a tamaño completo)

Siga estos pasos para crear una asignación de scripts comodín con IIS 6.0:

  1. Haga clic con el botón derecho en un sitio web y seleccione Propiedades.
  2. Seleccione la pestaña Directorio principal.
  3. Haga clic en el botón Configuración.
  4. Seleccione la pestaña Asignaciones.
  5. Haga clic en el botón Insertar (vea la figura 4).
  6. Pegue la ruta de acceso al archivo aspnet_isapi.dll en el campo Ejecutable (puede copiarla desde la asignación de scripts para los archivos .aspx).
  7. Desactive la casilla Comprobar que existe el archivo.
  8. Haga clic en el botón Aceptar.

Screenshot of the Internet Information Services 6 point 0 window, which is showing the Add slash Edit Application Extension Mapping dialog box.

Figura 4: Creación de una asignación de scripts comodín con IIS 6.0 (haga clic para ver la imagen a tamaño completo)

Después de habilitar las asignaciones de scripts comodín, debe modificar la tabla de rutas en el archivo Global.asax para que incluya una ruta raíz. De lo contrario, recibirá la página de error de la figura 5 cuando realice una solicitud de la página raíz de la aplicación. Puede usar el archivo Global.asax modificado en la lista 4.

Screenshot of the Microsoft Internet Explorer window, which is showing the Missing Root route error: The incoming request does not match any route.

Figura 5: Error de ausencia de la ruta raíz (haga clic para ver la imagen a tamaño completo)

Lista 4: Global.asax (modificado con la ruta raíz)

Public Class MvcApplication

        Inherits System.Web.HttpApplication 

        Shared Sub RegisterRoutes(ByVal routes As RouteCollection)

            routes.IgnoreRoute("{resource}.axd/{*pathInfo}") 

            ' MapRoute takes the following parameters, in order:

            ' (1) Route name

            ' (2) URL with parameters

            ' (3) Parameter defaults

            routes.MapRoute( _

                "Default", _

                "{controller}/{action}/{id}", _

                New With {.controller = "Home", .action = "Index", .id = ""} _

            ) 

            routes.MapRoute( _

                "Root", _

                "", _

                New With {.controller = "Home", .action = "Index", .id = ""} _

            ) 

        End Sub 

        Sub Application_Start()

            RegisterRoutes(RouteTable.Routes)

        End Sub

    End Class

Después de habilitar una asignación de scripts comodín para IIS 7.0 o IIS 6.0, puede realizar solicitudes que funcionen con la tabla de rutas predeterminada parecidas a estas:

/

/Home/Index

/Product/Details/3

/Product

Resumen

El objetivo de este tutorial era explicar cómo puede usar ASP.NET MVC al usar una versión anterior de IIS (o IIS 7.0 en modo clásico). Hemos analizado dos métodos para que funcione el enrutamiento de ASP.NET con versiones anteriores de IIS: modificar la tabla de rutas predeterminada o crear una asignación de scripts comodín.

Para la primera opción es necesario modificar las direcciones URL usadas en la aplicación ASP.NET MVC. Una ventaja muy importante de esta primera opción es que no necesita acceso a un servidor web para modificar la tabla de rutas. Esto significa que puede usar esta primera opción incluso al hospedar la aplicación ASP.NET MVC con una empresa de hospedaje de Internet.

La segunda opción consiste en crear una asignación de scripts comodín. La ventaja de esta segunda opción es que no es necesario modificar las direcciones URL. La desventaja es que puede afectar al rendimiento de la aplicación ASP.NET MVC.