2012-02-14 196 views
34

我希望你能幫助我解決下面的問題。ASP.NET MVC Url路由支持(點)

我在IIS7上使用ASP.NET MVC 3,並希望我的應用程序支持帶點用戶名。

例子:http://localhost/john.lee

這是我的Global.asax看起來像:(http://localhost/ {用戶名})

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

的應用程序協同工作,當我訪問其他頁面,例如http://localhost/john.lee/details

但主要的用戶頁面不起作用,我希望應用程序像Facebook一樣工作,其中支持http://www.facebook.com/john.lee

我用下面的代碼,它並沒有爲我工作的時候:

<httpRuntime relaxedUrlToFileSystemMapping="true" /> 

我可以使用下面的代碼,並獲取應用程序接受點,但我肯定不會喜歡下面使用代碼有很多不同的原因,請告訴我有一種方法可以解決這個問題。

<modules runAllManagedModulesForAllRequests="false" /> 
+0

http://stackoverflow.com/questions/8163401/dot-symbol-in-url – 2012-02-14 08:53:54

+1

我有同樣的問題,但在IIS 6 – 2012-02-14 08:54:07

+1

我無法重現該問題。它適用於我在IIS Express中(所以它也應該在IIS 7.0 +中工作)。此外,您似乎在指示'/ john.lee/details'形式的url,但根據您的路由定義,您無法指定操作。它將始終使用'ListAll'動作。所以這個問題與這裏的點沒有關係。這可能更多關於你的路線。 – 2012-02-14 09:58:30

回答

0

我不認爲點是這裏的問題。 AFAIK唯一不應該在用戶名中的字符是/

沒有看到匹配的路由john.lee/details很難說出了什麼問題,但我猜測你有另一條匹配url的路由,阻止了用戶細節路由從正確匹配。

我建議使用像Glimpse這樣的工具找出正在匹配什麼路線。

56

將UrlRoutingHandler添加到web.config中。這需要你的url更具體一些(f.e./Users/john.lee)。 這迫使每一個開頭的網址/用戶將被視爲一個MVC網址:

<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

我需要這個用於我的api控制器,它的工作就像一個魅力! – batzen 2013-01-31 22:52:22

+0

非常優雅的解決方案。謝謝! – 2014-01-02 09:41:25

+0

謝謝!我能夠使用它來解決http://stackoverflow.com/questions/11728846/dots-in-url-causes-404-with-asp-net-mvc-and-iis和http://stackoverflow.com/問題/ 9331516/asp-net-mvc-routing-add-html-extension-to-routes – user1454265 2014-02-12 18:43:59

4

只需添加此部分的Web.config,和所有請求路由/ {*} PATHINFO將由指定的方式處理處理程序,即使pathInfo中有點。 (從ServiceStack MVC主機的Web.config例如採取這個答案https://stackoverflow.com/a/12151501/801189

這應該既努力通過修改路徑IIS 6 & 7.您可以在「路徑」後,指定特定的處理程序不同的路徑=「*」號「添加」元素

<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

這似乎和使用System.Web.Routing.UrlRoutingHandler一樣工作 - 我只是不確定哪個更好或更高效 - UrlRoutingHandler似乎專門用於路由。 – Ripside 2015-04-28 13:25:30

+0

那麼,任何人都可以解釋TransferRequestHandler和UrlRoutingHandler之間的實際區別是什麼?哪些應該是首選? – Sergey 2017-08-08 13:25:36

+0

2017年有人還在使用IIS7堆棧! .NET Core和Kestrel好得多! – 2017-08-08 17:11:23