2011-04-15 17 views
8

Utworzono reguły routingu w mojej aplikacji ASP.NET i na mojej maszynie Dev w IIS7 wszystko działa poprawnie. Kiedy wdrażam rozwiązanie na serwerze prod, który ma również IIS7, pojawia się błąd 404 (strona nie znaleziona) podczas uzyskiwania dostępu do adresu URL. Może ktoś mógłby wskazać, gdzie jest problem?Błąd HTTP routingu 404.0 0x80070002

Rzeczywisty błąd

Błąd HTTP 404.0 - Not Found zasób szukasz została usunięta, zmieniono jej nazwę lub jest tymczasowo niedostępna . Szczegółowe Błąd InformationModule IIS Web Rdzeń Powiadomienie MapRequestHandler Handler StaticFile Kod błędu 0x80070002 Zamówiony URL http://xxx.xxx.xxx.xxx:80/pdf-button Fizyczne Ścieżki C: \ www \ pathtoproject \ pdf przycisku logowania Metoda Logowanie anonimowe anonimowym użytkownikiem

Moja Rzeczywisty Kod

 <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

z jakiego rodzaju trasy korzystałeś? MVC? –

+0

Używam klasy System.Web.Routing.RouteCollection (.NET 4.0) – Tomas

+0

Czego oczekujesz, aby została przekierowana na - pdf-button.aspx? Jestem pewien, że zdałeś sobie sprawę, że 0x80070002 = ERROR_FILE_NOT_FOUND – Rup

Odpowiedz

23

Po prostu znaleziono, że poniższe wiersze muszą być dodane do pliku web.config, teraz wszystko działa poprawnie na serwerze Prod też.

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

runAllManagedModulesForAllRequests = Sam "true" wykonał zadanie, ale rozwiązanie podane przez Roberta Bethge jest również lepsze. –

2

Moje rozwiązanie, po wypróbowaniu wszystko:

Bad rozmieszczenie, stary PrecompiledApp.config została wiszące wokół mojej lokalizacji wdrażania i czyni wszystko, co nie działa.

mojego ostatniego ustawienia, które działały:

  • IIS 7.5, Win2k8r2 x64,
  • Zintegrowany puli aplikacji trybu
  • nic się nie zmieni w web.config - oznacza to żadnych specjalnych procedur obsługi dla routingu . Oto moje migawki sekcji, do których odnosi się wiele innych postów. Używam FluorineFX, tak mam, że teleskopowa dodał, ale nie potrzeba żadnych innych:

    <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: (tylko metoda każdej nuty)

    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 - to osiągnąć automatyczne konwersji z http://andrew.arace.info/stackoverflow do http://andrew.arace.info/#stackoverflow które następnie przetwarzany przez 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

Zapisałeś mój dzień dzięki informacji PrecompiledApp.config. :-) Wielkie dzięki. – ekimpl

0

Odznacz to w Eksploratorze Windows.

„Ukryj rozszerzenia typów plików znanych typów”

8

Rozwiązanie sugerowane

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

prace, ale może obniżyć wydajność, a nawet może spowodować błędy, ponieważ teraz wszystkie moduły zarejestrowanym HTTP działać na każde żądanie, nie tylko zarządzane żądania (np. .aspx). Oznacza to moduły będą działać na każdym .jpg .gif .css .html .pdf itp

Bardziej sensownym rozwiązaniem jest uwzględnienie tego w swojej web.config:

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

kredytowego za jego idzie do Colin Farr. Sprawdź swój wpis na ten temat pod adresem http://www.britishdeveloper.co.uk/2010/06/dont-use-modules-runallmanagedmodulesfo.html.

1

Problemem dla mnie był nowy serwer, który System.Web.Routing był w wersji 3.5, podczas gdy web.config zażądał wersji 4.0.0.0. Uchwała została

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

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

0

Mając to na Global.asax.cs rozwiązał to dla mnie.

protected void Application_Start() 
     { 
      AreaRegistration.RegisterAllAreas(); 
      RouteConfig.RegisterRoutes(RouteTable.Routes); 
     } 
Powiązane problemy