2008-08-29 19 views
25

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

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

Me preguntaba cómo construir mejor las aplicaciones en ASP.NET MVC y facilitar su implementación en IIS6 e IIS7. Tenga en cuenta que esto es para hosts web estándar, por lo que no hay acceso a filtros ISAPI o configuraciones especiales dentro de IIS6.

¿Hay algo más que se debe tener en cuenta al desarrollar aplicaciones ASP.NET MVC para apuntar a IIS6? ¿Alguna función que no funciona?

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

+0

Gracias por esta pregunta: afortunadamente tropecé con ella antes de pasar mucho tiempo en un nuevo proyecto en MVC que tiene que ejecutarse bajo IIS6. Es bueno saber que esto es un problema antes de que llegue demasiado lejos ... – cori

Respuesta

14

Me tomó un poco, pero me di cuenta de cómo hacer que las extensiones funcionen con IIS 6. Primero, debe volver a trabajar el enrutamiento base para incluir .aspx para que se enruten a través del Filtro ASP.NET ISAPI.

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 correctamente. Pero Default.aspx y la dirección de página predeterminada de http://[website]/ dejan de funcionar correctamente. Entonces, ¿cómo es eso arreglado?

Bueno, debe definir una segunda ruta. Desafortunadamente, usando Default.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 se consigue esto para trabajar? Bueno, aquí es donde se 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, Default.aspx y http://[website]/ tanto empezar a trabajar de nuevo, creo que debido a que se ha asignado correctamente al controlador principal. 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 debe empezar a trabajar bien bajo IIS 6. (Por lo menos lo hace en mi PC.)

Y como un bono, 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 la extensión .aspx del controlador.

+0

recuerde que si alguna vez decide cambiar a IIS7 y eliminar .aspx, su SEO se arruinará. Necesitará mantener el enrutamiento heredado para que pueda 'encontrarlo' en el futuro –

+0

creando un reenvío de ruta de "estilo heredado" lo resolverá. – boj

+0

Esa segunda ruta solo necesita ser una ruta raíz con un valor de URL en blanco: routes.MapRoute ("Root", "", new {controller = "Home", action = "Index", id = ""}); – Scott

2

Con IIS6 se puede hacer una de dos cosas:

  1. instalación de un filtro ISAPI para asignar direcciones URL MVC ASP.NET a
  2. Include an extension in the URL. Por ejemplo: htp: //localhost/Home.mvc

Dado que la opción 1 no está disponible en la mayoría de los ejércitos web, usted tiene que ir a por el número 2.

4

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

Básicamente encamina urls coincidentes a la variedad {controller} .mvc, luego en ASP.NET reescribe esta url para eliminar .mvc - haciendo esto no tiene que definir ninguna ruta adicional ni exponer .mvc a tus usuarios.

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

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

7

Como no se 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.

+0

¿Por qué se votó en esta votación? Es una solución perfectamente válida. –

+0

Y el más apropiado, dado el OP. ¿Qué demonios, gente? – Chris

4

Como se ha mencionado en este blog post por Phil Hack, es posible que las direcciones URL de extensión-menos de configuración para ASP.NET MVC en IIS 6 utilizando wildcard application mappings:

  1. En IIS 6, vaya a las propiedades de configuración de aplicaciones de 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. Establezca el archivo ejecutable en la ruta de acceso de aspnet_isapi.dll (en mi equipo esto es c: \ windows \ microsoft.net \ framework \ v2.0.50727 \ aspnet_isapi.dll).
  4. Asegúrese de NO marcar la casilla "Verificar que el archivo exista" y haga clic en "Aceptar".

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

+0

De [blog.stevensanderson.com] (http://blog.stevensanderson.com/2008/07/04/options-for-deploying-aspnet-mvc-to-iis-6/): Resulta que usted puede [deshabilitar los mapas de comodines en las subcarpetas seleccionadas] (http://blog.stevensanderson.com/2008/07/07/overriding-iis6-wildcard-maps-on-individual-directories/), lo que puede darte lo mejor de ambos mundos . – nickvane

0

Tengo una aplicación de muestra en IIS6.

Encontré una solución rápida y sucia. (Sucio, porque contiene un nombre de vista predeterminado con extensión) No requiere una ruta adicional ni nada especial. (Excepto, la ruta por defecto debe {controlador} .aspx/{acción} ... 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> 

Mis aplicaciones de ejemplo acción predeterminada era índice, en el directorio de Inicio.

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