32 votes

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

Je suis d'essayer de déployer un ASP.NET MVC 3 application pour Windows server 2008 x64 (qui exécute IIS 7.0 évidemment), et IIS ne voulons pas servir le contenu correctement. Toutes les demandes sont la cause d'une 404.0 erreur, car les demandes ne correspondent pas tout gestionnaire et IIS est tentant d'utiliser la StaticFile gestionnaire de servir les demandes. Le problème semble être lié à .NET 4.0, car j'ai un MVC 2 application qui s'exécute très bien dans un pool d'application est configuré pour la .NET runtime 2.0.

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

Avant le déploiement, l'2008 server n'ont pas .NET 4.0 ou ASP.NET MVC 3 est installé, donc, voici les étapes que j'ai entrepris avant le déploiement de l'application:

  1. Installé .NET 4.0
  2. Couru aspnet_regiis.exe (à partir de la Framework64/v4.0.30319 dossier)
  3. Installé ASP.NET MVC 3, en utilisant le web platform installer
  4. Appliqué MS mise à jour KB980368 pour permettre à certaines IIS 7.0 ou IIS 7.5 gestionnaires pour gérer les demandes dont l'Url ne se termine pas avec une période de

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

Je suis aussi tombée sur la suite MS article de base de connaissances , qui indique que vous devez vous assurer que l'adresse HTTP de Redirection de Contenu Statique et de Compression sont activé/installé sur le serveur où vous rencontrez les erreurs 404. J'ai vérifié, et les deux caractéristiques ont déjà été activé pour mon serveur. J'ai même essayé de supprimer et de réinstaller les fonctionnalités en vain.

À ce point, je suis complètement à court d'idées pour savoir pourquoi cela ne fonctionne pas correctement. J'ai été en mesure de reproduire le problème sur 2 serveurs IIS 7.0. Ce qui me manque?

36voto

Mmerrell Points 705

Vous en fait tout m'a rappelé que j'avais besoin de résoudre ce problème dans un environnement ici. Si votre situation est la même que la mienne, alors c'est un simple correctif.

Il suffit d'ajouter les lignes suivantes à votre configuration web:

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

Edit:Pour fournir de plus amples explications sur la question à portée de main. Dans mon cas ce qui se passait était quand je l'ai ajouté itinéraire personnalisé mappages IIS était de voir les demandes de Dossier/Fichier Statique demandes et était donc sauter sur l'ASP.NET processus de travail. Il se comporte différemment selon l'environnement de développement en général parce qu'il est en cours d'exécution en vertu du serveur web de développement qui permettra également de passer toutes les requêtes à travers le .net processus.

Cette configuration Web de l'entrée indique IIS que vous avez des modules qui doivent être exécutées sur chaque requête web, même si IIS détermine à être statique fichier ou un dossier.

3voto

tugberk Points 16203

Assurez-vous que vous exécutez sous IIS 7.0 en mode Intégré. Si vous avez besoin de l'exécuter sous IIS 7.0 en mode Classique, vous avez besoin d'effectuer plusieurs actions pour rendre les routes travail. Veuillez consulter les billets de blog suivant;

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

2voto

Justin Holzer Points 1121

La question a fini par être que mon code était complètement en s'appuyant sur l'auto-démarrer la fonctionnalité qui est disponible uniquement dans IIS 7.5. J'ai pu découvrir le problème avec l'aide de l'Échec de la fonction de suivi des demandes dans IIS, et maintenant j'ai modifié mon global.asax.cs fichier, de sorte que la demande sera initialisé correctement, peu importe comment/quand il est chargé.

2voto

Andrew Arace Points 128

Ma solution, après avoir TOUT essayer:

Mauvais déploiement, un vieux PrecompiledApp.config était accroché autour de mon déployer emplacement, et en faisant tout pour ne pas travailler.

Ma dernière paramètres qui ont travaillé:

  • IIS 7.5, Win2k8r2 x64,
  • Le mode intégré de l'application de la piscine
  • Rien ne change dans le web.config - cela signifie qu'il n'spécial des gestionnaires pour le routage. Voici mon instantané des sections beaucoup d'autres postes de référence. Je suis en utilisant FluorineFX, donc je n'ai que gestionnaire ajouté, mais je n'ai pas besoin des 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>
    
  • Mondiale.ashx: (uniquement la méthode de la 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 - cela réalisé une conversion automatique de http://andrew.arace.info/stackoverflow pour http://andrew.arace.info/#stackoverflow ce qui pourrait ensuite être traitées par le défaut.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;
        }
    }
    

0voto

John Hamm Points 11

J'ai eu le même problème. Le mien a fini par être un échec de l'assemblée sur l'application de départ. J'ai activé la Fusion Visionneuse de Journal pour voir les assemblys qui n'avaient pas de et compris. Je n'aurais jamais découvert ce car il ressemblait à un MVC problème de routage, mais j'ai pensé que je voudrais ce post au cas où quelqu'un d'autre gaspillé des heures sur ce problème ainsi!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X