2011-04-15 32 views
8

He creado reglas de enrutamiento en mi aplicación ASP.NET y en mi máquina Dev en IIS7 todo funciona bien. Cuando implemente la solución para el servidor de prod, que también tiene IIS7, obtengo el error 404 (página no encontrada) al acceder a la URL. Tal vez alguien podría señalar dónde está el problema?Error HTTP de enrutamiento 404.0 0x80070002

error real

HTTP Error 404.0 - no encontrado El recurso que busca ha sido quitado, haya cambiado de nombre, o es disponible temporalmente. Detallada error InformationModule IIS Web Core Notificación MapRequestHandler Código de error Handler StaticFile 0x80070002 URL solicitada http://xxx.xxx.xxx.xxx:80/pdf-button física Ruta C: \ www \ pathtoproject \-pdf button inicio de sesión Método de inicio de sesión anónimo Usuario anónimo

Mi real Código

 <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)); 
         } 
       } 

      } 
} 
+0

¿qué tipo de ruta usó? MVC? –

+0

Uso la clase System.Web.Routing.RouteCollection (.NET 4.0) – Tomas

+0

¿Qué esperas que sea enrutado a: pdf-button.aspx? Como estoy seguro, se ha dado cuenta 0x80070002 = ERROR_FILE_NOT_FOUND – Rup

Respuesta

23

Acabo de encontrar que las líneas a continuación se deben agregar al archivo web.config, ahora todo funciona bien en el servidor Prod también.

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

runAllManagedModulesForAllRequests = "true" solo ha hecho el trabajo pero la solución dada por Robert Bethge también es mejor. –

2

Mi solución, después de intentar todo:

Malo despliegue, un viejo PreCompiledApp.config estaba colgando alrededor de mi ubicación de despliegue, y haciendo todo lo que no funciona.

Mis ajustes finales que ha trabajado:

  • IIS 7.5, 64, Win2k8r2
  • grupo de aplicaciones de modo integrado
  • nada cambia en el web.config - esto significa que no hay controladores especiales para enrutamiento . Aquí está mi instantánea de las secciones de muchas otras publicaciones de referencia. Estoy usando FluorineFX, por lo que tiene que manejador añadió, pero no necesitará 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); 
    } 
    
  • PassthroughRouteHandler .cs - esto logra una conversión automática http://andrew.arace.info/stackoverflow-http://andrew.arace.info/#stackoverflow que luego sería manejada por el 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; 
        } 
    } 
    
+0

Has guardado mi día con PrecompiledApp.config info. :-) Muchas gracias. – ekimpl

0

Desmarque esto en el Explorador de Windows.

"extensiones de archivos Ocultar para tipos conocidos"

8

la solución sugerida

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

obras, pero puede degradar el rendimiento e incluso pueden causar errores, porque ahora todos los módulos HTTP registrada ejecutan en cada petición, no solo las solicitudes administradas (por ejemplo, .aspx). Esto significa que los módulos se pueden ejecutar en cada .jpg .gif css html .pdf, etc.

Una solución más sensata es incluir esto en su web.config:

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

crédito por su va a Colin Farr. Mira su publicación sobre este tema en http://www.britishdeveloper.co.uk/2010/06/dont-use-modules-runallmanagedmodulesfo.html.

1

El problema para mí era un nuevo servidor que System.Web.Routing era de la versión 3.5, mientras que web.config solicitaba la versión 4.0.0.0. La resolución fue

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

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

0

Teniendo esto en Global.asax.cs lo resolvió para mí.

protected void Application_Start() 
     { 
      AreaRegistration.RegisterAllAreas(); 
      RouteConfig.RegisterRoutes(RouteTable.Routes); 
     } 
Cuestiones relacionadas