簡體   English   中英

這兩個ASP.NET MVC IgnoreRoute指令有什么區別?

[英]What is the difference between these two ASP.NET MVC IgnoreRoute directives?

默認的ASP.NET MVC 3項目模板包含以下IgnoreRoute指令:

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

我現在看到多個項目改變了這一行(包括StackExchange的DataExplorer ),而不是看起來像:

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

任何人都可以解釋在什么情況下或一般情況下為什么默認的.axd路由忽略不適合后者版本? 或者反過來說為什么人們會選擇不使用后一個版本而只是堅持默認?

我不得不承認我並不完全理解IgnoreRoute語法, 關於這個主題MSDN文檔非常簡潔。

Phil Haack的博客中有一個解釋: 使路由忽略文件擴展的請求

引用菲爾的基本想法是:

對此的一個解決方案是添加適當的忽略路由以指示路由應忽略這些請求。 不幸的是,我們做不到這樣的事情:

{*path}.aspx/{*pathinfo}

我們只允許一個catch-all路由,它必須發生在URL的末尾。 但是,您可以采取以下方法....

我在這里做的是Eilon向我展示的一種技術,即將所有URL映射到這些路由,然后通過約束字典限制忽略哪些路由。 因此,在這種情況下,這些路由將匹配(並因此忽略)對favicon.ico的所有請求(無論哪個目錄)以及對.aspx文件的請求。 由於我們告訴路由忽略這些請求,因此將發生這些請求的正常ASP.NET處理。

來自原始帖子的兩個IgnoreRoute調用之間的區別如下:

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

這將匹配請求像/ScriptManager.axd/Foo.axd/bar/baz.aspx資源,但不會請求任何*個.axd資源匹配您的網站的根目錄下,如/富/酒吧/巴茲。 axd

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

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

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

*{*allaxd} URL模式確保了整個路徑將被掃描,並且該路徑的不只是一個部分。 allaxd只是一個給予路徑匹配部分的arbtrary標簽,在這種情況下將是整個路徑。 這種忽略路由的方法有效地允許您忽略特定文件擴展名的路由。 您可以輕松復制此調用並進行一些更改,以忽略* .aspx,* .asmx等的路由。

有關路由的詳細文檔,我強烈推薦以下MSDN頁面

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM