2010-04-21 96 views
6

如果我在ASP.NET MVC1(或2)Web應用程序中爲靜態資源請求資源,請說...圖像或JavaScript文件或css文件... .NET框架試圖查看請求是否與路由列表匹配...並最終無法找到它的控制器?ASP.NET MVC路由和靜態數據(即圖像,腳本等)

例如。

資源:/Content/Images/Foo.png

這是否要求通過我的路由表..沒有任何的控制器/行動符合這個要求,然後直接嘗試這條道路?

回答

7

您可以選擇是否映射現有的文件或不設置RouteCollection.RouteExistingFiles物業

獲取或設置一個值,指示 ASP.NET路由是否應處理相匹配的現有文件 的URL。

下面是我從here閱讀:

但是,路由系統仍然檢查文件系統,看是否 傳入的URL恰好匹配文件或磁盤,如果是這樣,路由會忽略該請求(繞過 該URL可能也匹配的任何路由條目),以便該文件將直接提供。 這對靜態文件非常方便,如圖像,CSS和JavaScript文件。您可以將 保存在您的項目中(例如,在您的/ Content或/ Script文件夾中),然後直接爲它們提供服務,就像您根本沒有使用路由一樣。由於該文件在磁盤上真正存在 ,因此該文件優先於您的路由配置。

如果您希望您的路由配置優先於磁盤上的文件,則可以將RouteCollection的RouteExistingFiles屬性的 設置爲true。 (默認爲false)

+0

所以你說的是,它首先試圖找到磁盤上的文件(例如foo.png,something.js,some.ico,不管)。如果它沒有這樣做,它會在路由系統中啓動。因此,當它進入我自己的IControllerFactory(例如)時,假定資源在物理上不存在於磁盤上。最後,這是默認配置集(即RouteExistingFiles = false)。 – 2010-04-21 14:45:20

+0

是的,這是正確的 – 2010-04-21 15:08:21

0

你也可以在IIS中做一些小技巧。我將我的js,圖像,css等存儲在虛擬目錄下的Content文件夾中。

如果您然後查看Content文件夾的屬性(在IIS管理器中),請將其創建爲虛擬目錄,然後刪除通配符映射。然後將Content文件夾設置回普通目錄。這應該停止對由aspnet_isapi處理程序處理的這些文件的請求。

1

默認情況下,路由引擎將忽略服務器上物理存在的所有文件的路由映射。簡而言之,您需要爲MVC應用程序鏈接到靜態文件不做任何事情。