2011-08-22 134 views
7

默認的ASP.NET MVC 3項目模板包含以下IgnoreRoute指令:是什麼這兩個ASP.NET MVC IgnoreRoute指令之間的區別?

routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

我已經看到多個項目改變這一行(包括StackExchange's DataExplorer),而不是東西,看起來像:

routes.IgnoreRoute("{*allaxd}", new {allaxd = @".*\.axd(/.*)?"}); 

任何人都可以解釋在什麼情況下或一般,爲什麼默認.axd路線忽略不能滿足需求,而這後一個版本會是什麼?或者反過來,爲什麼會選擇一種不使用後者的版本,而不是僅僅堅持使用默認?

我不得不承認我不完全理解IgnoreRoute語法,而MSDN documentation on the subject非常簡潔。

+0

萬一有人在將來遇到這種情況,MS確實有一些關於在ASP.NET可用的路由的體面的文檔[這裏](http://msdn.microsoft.com/en-us/library/cc668201( v = VS.100)的.aspx)。具體查看關於** URL模式**的部分,該部分適用於MapRoute,IgnoreRoute等功能 –

回答

6

有一個在菲爾哈克的博客中解釋:Make Routing Ignore Requests For A File Extension

的基本理念,引用菲爾是:

一種解決方法是增加一個適當忽略路線指示路由應該忽略這些要求。不幸的是,我們不能做這樣的事情:

{*path}.aspx/{*pathinfo} 

我們只允許一個包羅萬象的路線,它必須在網址的結尾發生。但是,您可以採取以下方法....

我在做什麼這裏是一個技術Eilon表明我這是所有URL映射到這些路線,但後來通過限制的約束字典忽略的路由。所以在這種情況下,這些航線將匹配(從而忽略)的.aspx文件的favicon.ico的所有請求(無論哪個目錄)以及請求。由於我們告訴路由忽略這些請求,所以會發生這些請求的正常ASP.NET處理。

3

從原來的職位兩個IgnoreRoute調用之間的區別如下:

routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

這將匹配請求的資源,如/ScriptManager.axd/Foo.axd/bar/ baz.aspx,但將而不是匹配請求到任何* .axd資源低於您的網站的根,如/foo/bar/Baz.axd

routes.IgnoreRoute("{*allaxd}", new {allaxd = @".*\.axd(/.*)?"}); 

該調用使用正則表達式匹配任何*個.axd資源的請求,在您的網站的任何級別,例如/foo/bar/Baz.axd。因此,如果您引用網站根目錄下的任何axd資源,此調用將優於第一個調用。

如果分解正則表達式,開頭的.*將匹配0個或更多任何字符。 \.axd將與文字字符串".axd"匹配,並且(/.*)?將可選地匹配斜線,後跟0或更多任何字符。

{*allaxd}中的* URL模式確保將掃描整個路徑,而不僅僅是路徑的一部分。 allaxd僅僅是給路徑的匹配部分提供的arbtrary標籤,在這種情況下將是整個路徑。這種有效忽略路由的方法允許您忽略特定文件擴展名的路由。您可以輕鬆地複製此調用並進行一些更改以忽略* .aspx,* .asmx等的路由。

有關路由的詳細文檔,我強烈建議您使用the following MSDN page

相關問題