web-dev-qa-db-fra.com

Erreur HTTP de routage 404.0 0x80070002

J'ai créé des règles de routage dans mon application ASP.NET et sur ma machine de développement sur IIS7, tout fonctionne bien. Lorsque je déploie la solution sur le serveur prod qui a également IIS7, j'obtiens l'erreur 404 (page introuvable) lors de l'accès à l'URL. Peut-être que quelqu'un pourrait indiquer où est le problème?

Erreur réelle

Erreur HTTP 404.0 - Introuvable La ressource que vous recherchez a été supprimée, son nom a changé ou est temporairement indisponible. Informations détaillées sur l'erreur Module IIS Web Core Notification MapRequestHandler Handler StaticFile Error Code 0x80070002 URL demandée http://xxx.xxx.xxx.xxx:80/pdf-button Chemin physique C:\www\pathtoproject\pdf-button Méthode d'ouverture de session anonyme Utilisateur d'ouverture de session anonyme

Mon code actuel

     <add key="RoutePages" value="all,-forum/"/>

             UrlRewrite.Init(ConfigurationManager.AppSettings["RoutePages"]);


    public static class UrlRewrite
    {
            public static void Init(string routePages)
            {

                _routePages = routePages.ToLower().Split(new[] { ',' });
                RegisterRoute(RouteTable.Routes);




            }

            static void RegisterRoute(RouteCollection routes)
            {

                routes.Ignore("{resource}.axd/{*pathInfo}");
                routes.Ignore("favicon.ico");
                foreach (string routePages in _routePages)
                {
                    if (routePages == "all")
                        routes.MapPageRoute(routePages, "{filename}", "~/{filename}.aspx");
                    else
                        if (routePages.StartsWith("-"))
                            routes.Ignore(routePages.Replace("-", ""));
                        else
                        {
                            var routePagesNoExt = routePages.Replace(".aspx", "");
                            routes.MapPageRoute(routePagesNoExt, routePagesNoExt, string.Format("~/{0}.aspx", routePagesNoExt));
                        }
                }

            }
}
9
Tomas

Je viens de découvrir que les lignes ci-dessous doivent être ajoutées à web.config fichier, maintenant tout fonctionne bien aussi sur le serveur de production.

<system.webServer>
  <modules runAllManagedModulesForAllRequests="true" >
   <remove name="UrlRoutingModule"/>    
  </modules>
</system.webServer>
25
Tomas

La solution suggérée

<system.webServer>
  <modules runAllManagedModulesForAllRequests="true" >
    <remove name="UrlRoutingModule"/>    
  </modules>
</system.webServer>

fonctionne, mais peut dégrader les performances et peut même provoquer des erreurs, car maintenant tous les modules HTTP enregistrés s'exécutent sur chaque demande, pas seulement les demandes gérées (par exemple .aspx). Cela signifie que les modules fonctionneront sur chaque .jpg .gif .css .html .pdf etc.

Une solution plus judicieuse consiste à l'inclure dans votre web.config:

<system.webServer>
  <modules>
    <remove name="UrlRoutingModule-4.0" />
    <add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" preCondition="" />
  </modules>
</system.webServer>

Le mérite en revient à Colin Farr. Consultez son article sur ce sujet à http://www.britishdeveloper.co.uk/2010/06/dont-use-modules-runallmanagedmodulesfo.html .

11
Robert Bethge

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

Le problème pour moi était un nouveau serveur que System.Web.Routing était de la version 3.5 tandis que web.config demandait la version 4.0.0.0. La résolution a été

% WINDIR%\Framework\v4.0.30319\aspnet_regiis -i

% WINDIR%\Framework64\v4.0.30319\aspnet_regiis -i

1
Yaron Habot

Avoir cela dans Global.asax.cs l'a résolu pour moi.

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();
    RouteConfig.RegisterRoutes(RouteTable.Routes);
}
0
wolfQueen

Décochez cette option dans l'Explorateur Windows.

"Masquer les extensions de type de fichier pour les types connus"

0
MacGyver