ASP.NET MVC en IIS6


¿Dónde puedo encontrar algunos buenos consejos sobre las mejores prácticas para correr ASP.NET MVC en IIS6?

No he visto ninguna opción realista para los web-hosts que proporcionan IIS7-hosting todavía. Sobre todo porque no vivo en los EE.UU.

Así que me preguntaba cómo construir mejor aplicaciones en ASP.NET MVC y hacerlo fácilmente disponible para implementar tanto en IIS6 como en IIS7. Tenga en cuenta que esto es para servidores web estándar, por lo que no hay acceso a los filtros ISAPI o configuraciones especiales dentro IIS6.

¿ Hay algo más en lo que uno debería pensar al desarrollar ASP.NET MVC - ¿aplicaciones para apuntar a IIS6? ¿Alguna función que no funcione?

ACTUALIZACIÓN: Uno de los problemas más grandes es el asunto con las rutas. El pattern {controller} / {action} funcionará en IIS7, pero no en IIS6 que necesita {controller}.mvc/{action}. Entonces, ¿cómo hago esto transparente? De nuevo, no ISAPI y no IIS-settings, por favor.

Author: Seb Nilsson, 2008-08-29

8 answers

Me tomó un poco, pero descubrí cómo hacer que las extensiones funcionen con IIS 6. En primer lugar, es necesario volver a trabajar el enrutamiento base para incluir .aspx para que sean enrutados a través de la ASP.NET Filtro ISAPI.

routes.MapRoute(
    "Default",                                              // Route name
    "{controller}.aspx/{action}/{id}",                      // URL with parameters
    new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
);

Si navega a Inicio.aspx, por ejemplo, tu sitio debería estar funcionando bien. Pero Por defecto.aspx y la dirección de página predeterminada de http://[website]/ dejan de funcionar correctamente. ¿Cómo se arregla eso?

Bueno, necesitas definir una segunda ruta. Desafortunadamente, usando el Valor predeterminado.aspx como la ruta no funciona correctamente:

routes.MapRoute(
    "Default2",                                             // Route name
    "Default.aspx",                                         // URL with parameters
    new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
);

Entonces, ¿cómo haces que esto funcione? Bueno, aquí es donde necesita el código de enrutamiento original:

routes.MapRoute(
    "Default2",                                             // Route name
    "{controller}/{action}/{id}",                           // URL with parameters
    new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
);

Al hacer esto, por Defecto.aspx y http://[website]/ ambos comienzan a funcionar de nuevo, creo que porque se mapean con éxito al controlador de inicio. Así que la solución completa es:

public class MvcApplication : System.Web.HttpApplication
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            "Default",                                              // Route name
            "{controller}.aspx/{action}/{id}",                      // URL with parameters
            new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
        );

        routes.MapRoute(
            "Default2",                                              // Route name
            "{controller}/{action}/{id}",                            // URL with parameters
            new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
        );
    }

    protected void Application_Start()
    {
        RegisterRoutes(RouteTable.Routes);
    }
}

Y su sitio debería empezar a funcionar bien bajo IIS 6. (Al menos lo hace en mi PC.)

Y como beneficio adicional, si está utilizando Html.ActionLink() en sus páginas, no debería tener que cambiar ninguna otra línea de código en todo el sitio. Este método se encarga de etiquetar correctamente en el .extensión aspx al controlador.

 14
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-11-25 00:43:54

Ya que no puede modificar la configuración de IIS a mapear .mvc a ASP.Net, puede utilizar una extensión diferente que ya está asignada a ASP.Net. Por ejemplo, puedes usar {controller}.ashx/{action} and it should work out of the box on IIS 6.

 7
Author: Sean Carpenter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-30 12:31:04

No tiene que vivir con esa extensión si puede instalar un filtro ISAPI en el servidor.

Básicamente enrutas las url coincidentes al {controlador}.mvc variedad, luego en ASP.NET reescribe esta url para eliminarla .mvc doing haciendo esto no tienes que definir ninguna ruta extra o exponer .mvc a sus usuarios.

He escrito sobre esto aquí: http://www.flux88.com/UsingASPNETMVCOnIIS6WithoutTheMVCExtension.aspx

Y Steve Sanderson tiene un buen post aquí también: http://blog.codeville.net/2008/07/04/options-for-deploying-aspnet-mvc-to-iis-6 /

 4
Author: Ben Scheirman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-29 16:58:31

Como se menciona en este entrada de blog por Phil Hack, es posible configurar URL sin extensión para ASP.NET MVC en IIS 6 usando asignaciones de aplicaciones comodín :

  1. En IIS 6, vaya a las propiedades de configuración de la aplicación ASP.NET Aplicación web MVC.
  2. Haga clic en " Insertar..."en la sección Mapas de aplicaciones comodín.
  3. Establezca el Ejecutable en la ruta de acceso de aspnet_isapi.dll (en mi máquina esto es c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll).
  4. Asegúrese de NO marcar "Verificar que el archivo existe" y haga clic en "Aceptar".

Sin embargo, como también se mencionó por Hack, hay algunas implicaciones de rendimiento de hacer esto.

 4
Author: PropellerHead,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-21 07:05:00

Con IIS6 puedes hacer una de dos cosas:

  1. Configurar un filtro ISAPI para asignar URLs MVC a ASP.NET
  2. Incluye una extensión en la URL. Por ejemplo: htp://localhost/Home.mvc

Dado que la opción 1 no está disponible en la mayoría de los servidores web, debe elegir el número 2.

 2
Author: Espo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-29 08:56:11

La reescritura de url puede ayudarlo a resolver el problema. He implementado una solución que permite implementar la aplicación MVC en cualquier versión de IIS incluso cuando se utiliza alojamiento virtual. http://www.codeproject.com/KB/aspnet/iis-aspnet-url-rewriting.aspx

 1
Author: Alex Ilyin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-11-24 06:23:48

Tengo una aplicación de ejemplo en IIS6.

Encontré una solución rápida y sucia. (Sucio, porque contiene nombre de vista predeterminado con extensión) No requiere ruta adicional, ni nada especial. (Excepto que la ruta predeterminada debe ser {controller}.aspx/{action}... formato)

Aquí el valor predeterminado.aspx

<%@ Page Language="C#"%>
<script runat="server">
protected void Page_Load(object sender, EventArgs e)
{
    HttpContext.Current.RewritePath("~/Home.aspx/index");
    IHttpHandler httpHandler = new MvcHttpHandler();
    httpHandler.ProcessRequest(HttpContext.Current);
}
</script>

Mi acción predeterminada de las aplicaciones de ejemplo fue index, en el directorio Home.

Nota : Vi este código en el blog de Phil Haack. Gracias a Brian Lowe.

 0
Author: anov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-04-21 23:50:07

Tengo una guía detallada paso a paso, pero requiere que uses isapi_rewrite. Ver en: http://biasecurities.com/blog/2008/how-to-enable-pretty-urls-with-asp-net-mvc-and-iis6/

 -2
Author: Jim Geurts,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-02 20:21:40