web-dev-qa-db-fra.com

Obtention d'une erreur 404.0 pour l'application ASP.NET MVC 3 sur IIS 7.0 / Windows Server 2008

J'essaie de déployer une application ASP.NET MVC 3 sur un serveur Windows 2008 x64 (exécutant IIS 7.0 évidemment) et IIS ne veut pas sembler pour servir correctement le contenu. Toutes les demandes entraînent une erreur 404.0, car les demandes ne correspondent à aucun gestionnaire et IIS tente d'utiliser le gestionnaire StaticFile pour servir les demandes. Le problème semble être lié à .NET 4.0, car j'ai une application MVC 2 qui fonctionne très bien dans un pool d'applications configuré pour le runtime .NET 2.0.

Je n'ai eu aucun problème à déployer cette même application sur des serveurs IIS 7.5 à la fois sur Windows 7 et Windows Server 2008 R2.

Avant le déploiement, le serveur 2008 n'avait pas .NET 4.0 ou ASP.NET MVC 3 installé, voici donc les étapes que j'ai entreprises avant de déployer l'application:

  1. Installé .NET 4.0
  2. Ran aspnet_regiis.exe (à partir du dossier Framework64/v4.0.30319)
  3. ASP.NET MVC 3 installé à l'aide du programme d'installation de la plateforme Web
  4. Mise à jour MS appliquée KB980368 pour activer certains IIS 7.0 ou IIS 7.5 gestionnaires pour gérer les demandes dont les URL ne se terminent pas par un point)

Les demandes de ressources statiques dans l'application (fichiers JavaScript, images, etc.) sont traitées sans accroc, mais toute demande d'une action MVC échoue avec une erreur 404.0. J'ai remarqué que IIS utilise le gestionnaire StaticFile pour gérer ces demandes, ce qui est évidemment incorrect. Les gestionnaires ASP.NET 4.0 (c'est-à-dire les gestionnaires ExtensionlessUrl-ISAPI-4.0 *) sont correctement définis pour autant comme je peux le dire, je n'ai donc aucune idée pourquoi/comment la demande ne serait pas traitée par l'un de ces gestionnaires et tomberait jusqu'au gestionnaire StaticFile.

Je suis également tombé sur ce qui suit article de la base de connaissances MS qui mentionne que vous devez vous assurer que la redirection HTTP et la compression de contenu statique sont activées/installées sur le serveur où vous rencontrez les erreurs 404. J'ai vérifié et les deux fonctionnalités étaient déjà activées pour mon serveur. J'ai même essayé de supprimer et de réinstaller les fonctionnalités en vain.

À ce stade, je suis complètement à court d'idées pour expliquer pourquoi cela ne fonctionne pas correctement. J'ai pu reproduire le problème sur 2 serveurs IIS 7.0 différents. Que me manque-t-il?

32
Justin Holzer

Le problème a fini par être que mon code reposait entièrement sur la fonctionnalité de démarrage automatique qui n'est disponible que dans IIS 7.5. J'ai pu découvrir le problème à l'aide de la fonction de suivi des demandes ayant échoué dans IIS, et j'ai maintenant modifié mon fichier global.asax.cs afin que l'application soit correctement initialisée, quelle que soit la manière/le moment où elle est chargée.

2
Justin Holzer

En fait, vous venez de me rappeler que je devais résoudre ce problème dans un environnement ici. Si votre situation est la même que la mienne, c'est une solution simple.

Ajoutez simplement ce qui suit à votre configuration Web:

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

Modifier : Pour fournir des explications supplémentaires sur le problème à résoudre. Dans mon cas, ce qui se passait était lorsque j'ai ajouté des mappages de routes personnalisés IIS voyait les demandes comme des demandes de dossier/fichier statique et sautait donc le processus de travail ASP.NET. Cela se comporte différemment en cours de développement environnement généralement parce qu'il est exécuté sous le serveur Web de développement qui passera également toutes les demandes via le processus .net.

Cette entrée Web Config indique IIS que vous avez des modules qui doivent être exécutés sur chaque demande Web même si IIS détermine qu'il s'agit d'un fichier statique ou d'un dossier).

36
Michael Merrell

Veuillez vous assurer que vous exécutez sous IIS 7.0 mode intégré. Si vous devez l'exécuter sous IIS 7.0 mode classique, vous devez effectuer plusieurs actions pour pour que les itinéraires fonctionnent. Veuillez consulter les articles de blog suivants;

http://www.tugberkugurlu.com/archive/running-asp-net-mvc-under-iis-6-0-and-iis-7-0-classic-mode---solution-to- problème de routage

http://www.tugberkugurlu.com/archive/deployment-of-asp-net-mvc-3-rc-2-application-on-a-shared-hosting-environment-without-begging-the- société d'hébergement

3
tugberk

Ma solution, après avoir tout essayé:

Mauvais déploiement, un ancien PrecompiledApp.config traînait autour de mon emplacement de déploiement et faisait que tout ne fonctionnait pas.

Mes derniers paramètres qui ont fonctionné:

  • IIS 7.5, Win2k8r2 x64,
  • Pool d'applications en mode intégré
  • Rien ne change dans le web.config - cela signifie aucun gestionnaire spécial pour le routage. Voici mon instantané des sections de nombreuses autres références de messages. J'utilise FluorineFX, j'ai donc ajouté ce gestionnaire, mais je n'en ai pas eu besoin d'autres:

    <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: (seule méthode de n'importe quelle note)

    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);
    }
    
  • PassthroughRouteHandler.cs - ceci a réalisé une conversion automatique de http://andrew.arace.info/stackoverflow à http://andrew.arace.info/#stackoverflow qui serait puis être géré par le default.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
Andrew Arace

J'ai eu le même problème. Le mien a fini par être un assemblage raté au démarrage de l'application. J'ai activé Fusion Viewer pour voir quels assemblages échouaient et je l'ai compris. Je n'aurais jamais découvert cela car cela semblait être un problème de routage MVC, mais je me suis dit que je publierais cela au cas où quelqu'un d'autre aurait perdu des heures sur ce problème!

0
John Hamm

Si vous exécutez votre application Web sur IIS 7.5 ou supérieur, veuillez vous assurer que les services de rôle pour IIS sont correctement activés. Les services de rôle qui vous intéressent sont les suivants: ASP.NET, authentification de base, redirection HTTP, filtres ISAPI, etc.

Vous pouvez accéder aux services de rôle via Ajout/Suppression de programmes - Activez ou désactivez les fonctionnalités Windows. J'espère que cela t'aides.

Cordialement, Kiran Banda

0
Kiran Banda