Obtener el error 404.0 para ASP.NET Aplicación MVC 3 en IIS 7.0 / Windows Server 2008


Estoy intentando desplegar un ASP.NET MVC 3 aplicación a un servidor Windows 2008 x64 (ejecutando IIS 7.0 obviamente), y IIS no quiere parecer servir el contenido correctamente. Todas las solicitudes están dando lugar a un error 404.0, porque las solicitudes no coinciden con ningún controlador e IIS está intentando usar el controlador StaticFile para servir las solicitudes. El problema parece estar relacionado con. NET 4.0, ya que tengo una aplicación MVC 2 funcionando bien en un grupo de aplicaciones que está configurado para. NET 2.0 tiempo de ejecución.

No he tenido problemas para implementar esta misma aplicación en servidores IIS 7.5 tanto en Windows 7 como en Windows Server 2008 R2.

Antes de la implementación, el servidor 2008 no tenía. NET 4.0 o ASP.NET MVC 3 instalado, así que aquí están los pasos que emprendí antes de implementar la aplicación:

  1. . NET instalado 4.0
  2. Corrí aspnet_regiis.exe (de la carpeta Framework64/v4.0.30319)
  3. Instalado ASP.NET MVC 3 usando la plataforma web instalador
  4. Se aplicó MS update KB980368 para habilitar ciertos controladores de IIS 7.0 o IIS 7.5 para manejar solicitudes cuyas URL no terminan con un punto

Las solicitudes a recursos estáticos en la aplicación (archivos JavaScript, imágenes, etc.) se realizan sin problemas, pero cualquier solicitud a una acción MVC falla con un error 404.0. Me he dado cuenta de que IIS está utilizando el controlador StaticFile para manejar estas solicitudes, lo cual es obviamente incorrecto. Las ASP.NET 4.0 handlers (i. e. ExtensionlessUrl-ISAPI-4.0 * handlers) están correctamente definidos por lo que puedo decir, por lo que no tengo idea de por qué/cómo la solicitud no sería manejada por uno de estos handlers y caería hasta el final hasta el controlador de StaticFile.

También me encontré con el siguiente artículo de MS knowledge base que menciona que debe asegurarse de que la redirección HTTP y la Compresión de contenido estático estén habilitadas/instaladas en el servidor donde está experimentando los errores 404. Lo comprobé, y ambos las funciones ya estaban habilitadas para mi servidor. Incluso intenté eliminar y reinstalar las características en vano.

En este punto estoy completamente sin ideas de por qué esto no está funcionando correctamente. He podido replicar el problema en 2 servidores IIS 7.0 diferentes. ¿Qué me estoy perdiendo?

Author: Justin Holzer, 2011-02-25

6 answers

En realidad me acaba de recordar que necesitaba solucionar este problema en un entorno aquí. Si tu situación es la misma que la mía, entonces es una solución simple.

Simplemente agregue lo siguiente a su configuración web:

<system.webServer>
    <modules runAllManagedModulesForAllRequests="true" />

Editar : Para proporcionar una explicación adicional sobre el tema en cuestión. En mi caso, lo que estaba sucediendo era que cuando agregué asignaciones de rutas personalizadas IIS veía las solicitudes como solicitudes de carpetas / Archivos estáticos y, por lo tanto, saltaba el ASP.NET proceso del trabajador. Esto se comporta de manera diferente en el entorno de desarrollo generalmente porque se está ejecutando bajo el servidor web de desarrollo que también pasará todas las solicitudes a través del proceso.net.

Esta entrada de configuración web le dice a IIS que tiene módulos que deben ejecutarse en cada solicitud web, incluso si IIS determina que es un archivo estático o una carpeta.

 36
Author: Michael Merrell,
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
2016-02-02 10:57:28

Asegúrese de que se está ejecutando en modo integrado IIS 7.0. Si necesita ejecutarlo en modo clásico IIS 7.0, debe realizar varias acciones para que las rutas funcionen. Por favor, consulte el siguiente blog puestos;

Http://www.tugberkugurlu.com/archive/running-asp-net-mvc-under-iis-6-0-and-iis-7-0-classic-mode---solution-to-routing-problem

Http://www.tugberkugurlu.com/archive/deployment-of-asp-net-mvc-3-rc-2-application-on-a-shared-hosting-environment-without-begging-the-hosting-company

 3
Author: tugberk,
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
2015-01-07 00:10:06

El problema terminó siendo que mi código dependía completamente de la funcionalidad de inicio automático que solo está disponible en IIS 7.5. Pude descubrir el problema con la ayuda de la función de Seguimiento de Solicitudes Fallidas en IIS, y ahora he modificado mi global.asax.archivo cs para que la aplicación se inicialice correctamente, independientemente de cómo / cuándo se cargue.

 2
Author: Justin Holzer,
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
2011-02-28 16:08:36

Mi solución, después de probar TODO:

Mal despliegue, una vieja PrecompiledApp.config estaba rondando mi ubicación de despliegue, y haciendo que todo no funcionara.

Mis ajustes finales que funcionaron:

  • IIS 7.5, Win2k8r2 x64,
  • Grupo de aplicaciones de modo integrado
  • Nada cambia en la web.config - esto significa que no hay controladores especiales para el enrutamiento. Aquí está mi instantánea de las secciones de referencia de muchos otros posts. Estoy usando FluorineFX, así que tengo ese manejador agregado, pero no necesitaba ningún otro:

    <system.web>
      <compilation debug="true" targetFramework="4.0" />
      <authentication mode="None"/>
    
      <pages validateRequest="false" controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID"/>
      <httpRuntime requestPathInvalidCharacters=""/>
    
      <httpModules>
        <add name="FluorineGateway" type="FluorineFx.FluorineGateway, FluorineFx"/>
      </httpModules>
    </system.web>
      <system.webServer>
        <!-- Modules for IIS 7.0 Integrated mode -->
        <modules>
          <add name="FluorineGateway" type="FluorineFx.FluorineGateway, FluorineFx" />
        </modules>
    
        <!-- Disable detection of IIS 6.0 / Classic mode ASP.NET configuration -->
        <validation validateIntegratedModeConfiguration="false" />
      </system.webServer>
    
  • Global.ashx: (único método de cualquier nota)

    void Application_Start(object sender, EventArgs e) {
        // Register routes...
        System.Web.Routing.Route echoRoute = new System.Web.Routing.Route(
              "{*message}",
            //the default value for the message
              new System.Web.Routing.RouteValueDictionary() { { "message", "" } },
            //any regular expression restrictions (i.e. @"[^\d].{4,}" means "does not start with number, at least 4 chars
              new System.Web.Routing.RouteValueDictionary() { { "message", @"[^\d].{4,}" } },
              new TestRoute.Handlers.PassthroughRouteHandler()
           );
    
        System.Web.Routing.RouteTable.Routes.Add(echoRoute);
    }
    
  • Passthroutehandler.cs-esto logró una conversión automática de http://andrew.arace.info/stackoverflow a http://andrew.arace.info/#stackoverflow que luego sería manejado por el valor predeterminado.aspx:

    public class PassthroughRouteHandler : IRouteHandler {
    
        public IHttpHandler GetHttpHandler(RequestContext requestContext) {
            HttpContext.Current.Items["IncomingMessage"] = requestContext.RouteData.Values["message"];
            requestContext.HttpContext.Response.Redirect("#" + HttpContext.Current.Items["IncomingMessage"], true);
            return null;
        }
    }
    
 2
Author: Andrew Arace,
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
2012-03-17 16:13:42

Si está ejecutando su aplicación web en IIS 7.5 o superior, asegúrese de que los servicios de rol para IIS estén habilitados correctamente. Los servicios de rol de interés son : ASP.NET, Autenticación básica, Redirección HTTP, filtros ISAPI, etc.

Puede ir a los servicios de rol a través de Agregar o Quitar programas - Activar o desactivar las características de Windows. Espero que esto ayude.

Saludos, Kiran Banda

 0
Author: Kiran Banda,
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
2012-03-13 08:52:28

Yo tenía el mismo problema. El mío terminó siendo un montaje fallido al iniciar la aplicación. Habilité el Visor de registros de Fusion para ver qué ensamblados estaban fallando y lo descubrí. Nunca habría descubierto esto ya que parecía un problema de enrutamiento MVC, pero pensé que publicaría esto en caso de que alguien más desperdiciara horas en este problema también!

 0
Author: John Hamm,
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
2013-03-22 22:36:42