2012-02-14 17 views
34

Mam nadzieję, że możesz mi pomóc z poniższym problemem.ASP.NET MVC Obsługa trasy Url (kropka)

Używam ASP.NET MVC 3 na IIS7 i chciałbym, aby moja aplikacja obsługiwała nazwy użytkownika kropkami.

Przykład: http://localhost/john.lee

To jest jak moja Global.asax wygląda następująco: (http://localhost/ {username})

routes.MapRoute(
    "UserList", 
    "{username}", 
    new { controller = "Home", action = "ListAll" } 
); 

Aplikacje działa, kiedy dostęp do innych stron, takich jak http://localhost/john.lee/details itp

Ale główna strona użytkownika nie działa, chciałbym, aby aplikacja działała jak Facebook, gdzie obsługiwana jest http://www.facebook.com/john.lee.

Użyłem poniżej kod i nie działa na mnie w ogóle:

<httpRuntime relaxedUrlToFileSystemMapping="true" /> 

udało mi się skorzystać z poniższego kodu i pobrać aplikację, aby zaakceptować kropki ale na pewno nie chciałby skorzystać z poniższego Kod z wielu różnych powodów, proszę powiedz mi, że istnieje sposób na przezwyciężenie tego problemu.

<modules runAllManagedModulesForAllRequests="false" /> 
+0

http://stackoverflow.com/questions/8163401/dot-symbol-in-url –

+1

mam ten sam problem, ale w IIS 6. –

+1

nie jestem w stanie odtworzyć problem. Działa to dla mnie w IIS Express (więc powinien również działać w IIS 7.0+). Wygląda na to, że podajesz URL formularza/john.lee/details, ale zgodnie z definicją trasy nie możesz podać akcji. Zawsze będzie używać akcji 'ListAll'. Problem nie jest tak naprawdę związany z kropką tutaj. To prawdopodobnie więcej o twoich trasach. –

Odpowiedz

0

Nie sądzę, że problemem jest tutaj kropka. AFAIK jedyny znak, który nie powinien znajdować się w nazwie użytkownika, to brak widoku trasy, która pasuje do john.lee/details, trudno powiedzieć, co jest nie tak, ale domyślam się, że masz inną trasę, która pasuje do adresu URL, uniemożliwiając szczegóły trasy użytkownika zostały poprawnie dopasowane.

Zalecam użycie narzędzia takiego jak Glimpse, aby dowiedzieć się, jaka droga jest dopasowywana.

56

Dodaj UrlRoutingHandler do pliku web.config. Wymaga to jednak bardziej szczegółowego adresu URL (np. /Users/john.lee). Zmusza to każdy adres URL rozpoczynający się/użytkowników należy traktować jako MVC URL:

<system.webServer>  
    <handlers>  
    <add name="UrlRoutingHandler" 
     type="System.Web.Routing.UrlRoutingHandler, 
       System.Web, Version=4.0.0.0, 
       Culture=neutral, 
       PublicKeyToken=b03f5f7f11d50a3a" 
     path="/Users/*" 
     verb="GET"/>  
    </handlers> 
</system.webServer> 
+0

Potrzebowałem tego dla mojego kontrolera api i działało jak czar! – batzen

+0

Bardzo eleganckie rozwiązanie. Dzięki! –

+0

Dziękujemy! Byłem w stanie użyć tego do rozwiązania http://stackoverflow.com/questions/11728846/dots-in-url-causes-404-with-asp-net-mvc-and-iis i http://stackoverflow.com/ pytania/9331516/asp-net-mvc-routing-add-html-extension-to-routes – user1454265

4

Wystarczy dodać tej sekcji Web.config i wszystkie żądania do trasy/{*} pathinfo będą obsługiwane przez określony obsługi, nawet gdy w pathInfo znajdują się kropki. (Zaczerpnięte z ServiceStack MVC przykład Web.config Host i ta odpowiedź https://stackoverflow.com/a/12151501/801189)

To powinno działać zarówno dla IIS 6 & 7. Można przypisać konkretne ładowarki do różnych ścieżek po trasie „” modyfikując path = „*” w „dodać” elementy

<location path="route"> 
    <system.web> 
     <httpHandlers> 
     <add path="*" type="System.Web.Handlers.TransferRequestHandler" verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" /> 
     </httpHandlers> 
    </system.web> 
    <!-- Required for IIS 7.0 --> 
    <system.webServer> 
     <modules runAllManagedModulesForAllRequests="true" /> 
     <validation validateIntegratedModeConfiguration="false" /> 
     <handlers> 
     <add name="ApiURIs-ISAPI-Integrated-4.0" path="*" type="System.Web.Handlers.TransferRequestHandler" verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" preCondition="integratedMode,runtimeVersionv4.0" /> 
     </handlers> 
    </system.webServer> 
    </location> 
+2

To wydaje się działać tak dobrze, jak przy użyciu System.Web.Routing.UrlRoutingHandler - po prostu nie jestem pewien, który jest lepszy lub bardziej wydajny - UrlRoutingHandler wydaje się być specjalnie ukierunkowane na routing. – Ripside

+0

Czy ktoś może wyjaśnić, jaka jest rzeczywista różnica między TransferRequestHandler i UrlRoutingHandler? Który z nich powinien być preferowany? – Sergey

+0

Czy ktoś nadal używa stosu IIS7 w 2017 roku !? .NET Core i Kestrel są o wiele lepsze! –