背景
在預設情況下,MVC架構是支援對伺服器靜态資源的通路的,我們在項目根目錄下建立一個Content檔案夾,然後添加一個命名為“StaticContent.html”的html檔案,如下圖所示:

StaticContent.html中的代碼如下圖所示:
This is the static html file(~/Content/StaticContent.html)
運作項目,輸入URL,可以看到能通路到這個檔案:
為磁盤檔案定義路由
為了安全考慮,希望使用者不能通路某些檔案夾,我們可以增加如下代碼:
public static void RegisterRoutes(RouteCollection routes)
{
routes.RouteExistingFiles = true;
}
這段代碼告訴MVC架構,對于靜态檔案我們也要走路由機制(預設情況下,MVC架構發現請求的檔案存在于伺服器上時,會繞過路由機制,直接讀取檔案)
然後建立一條更具體的靜态路由,映射檔案路徑請求,如下圖所示:
public static void RegisterRoutes(RouteCollection routes)
{
routes.RouteExistingFiles = true;
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapMvcAttributeRoutes();
//映射到Customer控制器上的List方法
routes.MapRoute("DiskFile","Content/StaticContent.html",new { controller = "Customer",action = "List"});
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
再次運作項目, 還是能通路到,如下圖所示:
配置應用程式伺服器
以上這麼做還不夠,需要配置應用程式伺服器。首先啟動MVC項目,在右下角找到 IIS Express,如下圖所示:
右鍵點選, 選擇“顯示所有應用程式”後,如下圖所示:
單擊網站名稱後,在出現的配置一欄中,再次點選配置,如下圖所示:
在打開的檔案中,搜尋“UrlRoutingModule-4.0” 關鍵字,如下圖所示:
将preCondition屬性設定為空字元串,如下圖所示:
在VS中重新運作項目,讓修改後的配置生效,并導航到/content/StaticContent.html,可以看到映射已經生效:
當然,可以自己修改Customer控制器下List方法傳回的頁面代碼,增加個提示,比如“無法通路資源檔案”什麼的。
注意IIS 和 IIS Express的處理方式是有差別的,如果你的程式釋出到IIS上,需要在web.config中添加如下代碼,否則靜态檔案還是會交由IIS處理,而不會被路由。如下圖所示:
.......
繞過路由系統
到這裡還沒結束,以上方法禁止了對所有資源檔案的通路。如果現在去請求scripts檔案夾下的靜态js檔案,能看到如下圖所示:
如果希望排除某些資源檔案 ,繞過路由系統,可以用以下代碼:
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.RouteExistingFiles = true;
routes.IgnoreRoute("Scripts/{*pathInfo}");
}
}
在這種情況下,URL模式将比對任何兩個片段的URL,第一個片段是“Scripts”,第二個片段{*pathInfo}是所有路徑的意思。
IgnoreRoute方法在RouteCollection中建立了一個條目,在RouteCollection中路由處理程式是StopRoutingHandler類的一個執行個體,而不是MvcRouteHandler類。路由系統被寫死以識别這個處理程式。如果傳遞給IgnoreRoute方法的URL模式比對,那麼後面的路由将不會被計算,就像比對一個普通的路由一樣。
再次通路JS檔案,成功,如下圖所示:
本文結束 ,部分參考來自這篇文章