Pregunta

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

Todavía no he visto ninguna opción realista para servidores web que proporcionen alojamiento IIS7.Principalmente porque no vivo en los EE. UU.

Entonces me preguntaba cuál es la mejor manera de crear aplicaciones en ASP.NET MVC y hacerlas fácilmente disponibles para implementarlas tanto en IIS6 como en IIS7.Tenga en cuenta que esto es para servidores web estándar, por lo que no hay acceso a filtros ISAPI ni configuraciones especiales dentro de IIS6.

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

ACTUALIZAR:Uno de los mayores problemas es el tema de las rutas.El patrón {controller}/{action} funcionará en IIS7, pero no en IIS6, que necesita {controller}.mvc/{action}.Entonces, ¿cómo hago para que esto sea transparente?De nuevo, sin ISAPI y sin configuración de IIS, por favor.

¿Fue útil?

Solución

Me tomó un poco, pero descubrí cómo hacer que las extensiones funcionen con IIS 6.Primero, debe reelaborar el enrutamiento base para incluir .aspx de modo que se enruten a través del filtro ISAPI de ASP.NET.

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

Si navega a Home.aspx, por ejemplo, su sitio debería funcionar bien.Pero Default.aspx y la dirección de página predeterminada de http://[sitio web]/ dejar de funcionar correctamente.Entonces, ¿cómo se soluciona eso?

Bueno, es necesario definir una segunda ruta.Desafortunadamente, usar Default.aspx como 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 se consigue que esto funcione?Bueno, aquí es donde necesitas el código de ruta original:

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

Cuando haces esto, Default.aspx y http://[sitio web]/ Ambos empiezan a funcionar de nuevo, creo que porque se asignan correctamente al controlador de inicio.Entonces 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 en IIS 6.(Al menos lo hace en mi PC).

Y como beneficio adicional, si utiliza 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 la extensión .aspx en el controlador.

Otros consejos

Como no puede modificar la configuración de IIS para asignar .mvc a ASP.Net, puede usar una extensión diferente que ya esté asignada a ASP.Net.Por ejemplo, podría usar {controller}.ashx/{action} y debería funcionar de inmediato en IIS 6.

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

Básicamente, enruta las URL coincidentes a la variedad {controller}.mvc, luego en ASP.NET reescribe esta URL para eliminar .mvc; al hacerlo, no tiene que definir ninguna ruta adicional ni exponer .mvc a sus usuarios.

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

y Steve Sanderson también tiene una buena publicación aquí: http://blog.codeville.net/2008/07/04/options-for-deploying-aspnet-mvc-to-iis-6/

Como se menciona en este entrada en el 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 Propiedades de configuración de la aplicación para su aplicación web ASP.NET MVC.
  2. Haga clic en "Insertar..." en la sección de mapas de la aplicación comodín.
  3. Configure el ejecutable en la ruta 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 mencionó Hack, hacer esto tiene algunas implicaciones de rendimiento.

Con IIS6 puedes hacer una de dos cosas:

  1. Configure un filtro ISAPI para asignar URL de MVC a ASP.NET
  2. Incluir 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 optar por la número 2.

La reescritura de URL puede ayudarle a resolver el problema.Implementé una solución que permite implementar aplicaciones MVC en cualquier versión de IIS, incluso cuando se utiliza alojamiento virtual.http://www.codeproject.com/KB/aspnet/iis-aspnet-url-rewriting.aspx

Tengo una aplicación de muestra en IIS6.

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

Aquí el default.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>

La acción predeterminada de mis aplicaciones de muestra fue indexar, en el directorio de inicio.

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

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top