2009-10-22 13 views
10

Próbuję zaimplementować routing adresu URL ASP.NET przy użyciu System.Web.Routing. Wydaje się, że działa to dobrze na moim lokalnym hoście, ale kiedy jestem na żywo, otrzymuję błąd 404 w IIS 7 (nie znaleziono pliku). Dla celów FYI hosting korzysta z Windows Server 2008 IIS7.Łamanie mojej głowy, aby uzyskać routing adresu URL w środowisku hostingowym IIS 7: ASP.NET

Myślę, że to robi jakąś różnicę w posługiwaniu się mechanizmem routingu. Ale nie jestem w stanie dowiedzieć się, co dokładnie się dzieje. Poniżej znajdują się ustawienia i zmiany, które wprowadziłem do tej pory, aby działały i przyznam sobie trochę kredytu. Działa to absolutnie dobrze lokalnie.

Ustawienia web.config

A potem mam sekcji system.webServer który ma następujące znaczników

<system.webServer> 
    <validation validateIntegratedModeConfiguration="false"/> 
    <modules runAllManagedModulesForAllRequests="true"> 
     <remove name="Session" /> 
     <add name="Session" type="System.Web.SessionState.SessionStateModule"/> 
     <add name="UrlRoutingModule" 
       type="System.Web.Routing.UrlRoutingModule, 
        System.Web.Routing, Version=3.5.0.0, 
        Culture=neutral, 
        PublicKeyToken=31BF3856AD364E35" /> 

    </modules> 
    <handlers> 
     <add name="UrlRoutingHandler" preCondition="integratedMode" verb="*" path="UrlRouting.axd" type="System.Web.HttpForbiddenHandler, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> 
    </handlers> 

</system.webServer> 

następnie w sekcji Application_Start mam zdefiniowaną jako jedną trasą to:

void Application_Start(object sender, EventArgs e) 
{ 
    RegisterRoutes(RouteTable.Routes); 
} 
void RegisterRoutes(RouteCollection routes) 
{    
    routes.Add(
     "MyRoute", 
      new Route("ProductDetail/{ProductId}/{ProductName}", 
       new MyRouteHandler("~/ProductDetail.aspx"))); 
} 

Wreszcie MyRouteHandler wygląda następująco:

public IHttpHandler GetHttpHandler(RequestContext requestContext) 
{ 
    var display = (Page)BuildManager.CreateInstanceFromVirtualPath(
        _virtualPath, typeof(Page)); 
    HttpContext.Current.Items["ProductId"] = requestContext.RouteData.Values["Product"]; 
    return display; 
} 

A na kierowane strony jestem chwytając identyfikator produktu następująco

ProductId = (int)HttpContext.Current.Items["Product"]; 

I to jest koniec mojego bałaganu. Działa to dobrze na miejscu. Próbowałem tego przez jakiś czas, ale nie udało mi się tak daleko.

WSZELKIE POMOCY ZOSTANĄ GŁĘBOKIE UZGODNIONE.

Dzięki ...

+1

czy wprowadzono jakieś zasady przepisywania? – Rony

Odpowiedz

2

Nie jestem pewien, czy udało Ci się ustalić przyczynę problemu ... jednak jeśli nadal szukasz rozwiązania, możesz spróbować następujących rozwiązań. Po pewnym czasie musiałem zmierzyć się z tą samą sytuacją i zmusić ją do pracy z regułami Przepisywania w konfiguracji sieciowej, dla których nie potrzebujesz żadnego mechanizmu routingu. Najpierw zachęcam do usunięcia wszelkich ustawień routingu i kodu z pliku Global.asax.

Następnie w sekcji można dodać jako zasad przepisywania następująco

<rewrite> 
    <rewriteMaps> 
     <rewriteMap name="map1" defaultValue="(.+)"/> 
    </rewriteMaps> 
    <rules> 
     <rule name="Rewrite rule1 for map1"> 
     <match url="product/(.+)/(.+)"/> 
     <conditions> 
      <add input="{map1:{REQUEST_URI}}" pattern="(.+)"/> 
     </conditions> 
     <action type="Rewrite" url="productdetail.aspx?Product={R:1}" appendQueryString="false" redirectType="Permanent"/> 
     </rule> 
    </rules> 
    </rewrite> 

Jeśli masz problemy ze zrozumieniem mechanizm przepisywania Polecam lekturę this article Scott Guthrie.

Myślę, że to powinno działać dla ciebie, biorąc pod uwagę środowisko IIS 7.0 lub 7.5.

+0

tak długo zastanawiałem się nad problemem i naprawiłem go za pomocą sam przepisać mapy ... w każdym razie dzięki za odpowiedź – user153410

+0

użytkownik153410, mam ten sam problem. Czy możesz zasugerować, jak to naprawiłeś? – Riz

4

I przestrzegać tego artykułu: How to: Use Routing with Web Forms

zanim znalazłem go miałem problemy na moim udostępnionego hosta i żaden lokalnie. To był mój web.config.

Mój gospodarz był przy użyciu IIS 7 ze zintegrowanym rurociąg, brakowało mi tego:

<handlers> 
    <!---after all the others--->  
    <add name="UrlRoutingHandler" preCondition="integratedMode" verb="*" 
      path="UrlRouting.axd" 
      type="System.Web.HttpForbiddenHandler, 
      System.Web, Version=2.0.0.0, 
      Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> 
</handlers> 

EDIT: Zgodnie z ustawieniami i kodu, jedyną rzeczą, w lewo jest sprawdzić, czy masz dll Routing zdefiniowany w pliku web.config, a także wdrażane w katalogu bin:

<add assembly="System.Web.Routing, Version=3.5.0.0, 
    Culture=neutral, 
    PublicKeyToken=31BF3856AD364E35"/> 
+0

Cześć dzięki za odpowiedź. Czy możesz powiedzieć, jakie zmiany wprowadziłeś w swoim web.config. To byłoby naprawdę pomocne. – user153410

+0

Dodałem, co naprawiło mój problem. W artykule wyjaśniono, jak skonfigurować usługę Routing na podstawie ustawień hosta. –

+0

Witam Jeszcze raz dziękuję za odpowiedź. Mam wszystko w Web.Config i przeglądnęłam artykuł, który zasugerowałeś. Jak mam wszystkie niezbędne ustawienia w Web.Config. Naprawdę nie jestem w stanie zrozumieć, dlaczego to robi. Nie wiem, dlaczego IIS 7 jest tak skomplikowany w uzyskiwaniu prostych rzeczy, takich jak routing URl lub przepisywanie jest bardzo popularne w dzisiejszych czasach. – user153410

3

Wypróbuj to w swoim web.config. Pracował dla mnie.

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

Po przesłaniu strony internetowej z lokalnego dev do hosta, otrzymałem 404 na routingu. runAllManagedModulesForAllRequests rozwiązało problem. –

Powiązane problemy