簡體   English   中英

為什么 CSS 和 JS 文件繞過 Asp.Net MVC 路由?

[英]Why CSS and JS files bypass Asp.Net MVC routes?

我收到了一個使用 Asp.Net MVC4 構建的原型應用程序。 它目前正在用一個使用 NInject、ServiceLocator 和所有的自定義工廠替換默認的 controller 工廠。

問題在於,通過替換默認的 controller 工廠,對 JS 文件的請求被視為對 controller 和操作的合法請求。

因此,查看 Visual Studio 創建的默認模板,路由配置如下所示:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id =   UrlParameter.Optional }
    );
}

看完之后,我問自己:為什么 Asp.Net MVC 無法解釋對“/Scripts/jquery.js”的請求? 我的意思是,為什么它不認為“腳本”是一個 controller 而“jquery.js”是一個動作?

因為如果我禁用 controller 工廠覆蓋,該項目就可以工作,所以我只能假設默認工廠負責這種檢查。 這意味着“/Scripts/jquery.js”確實傳遞給了 controller 工廠,這是我真的不知道的事情。

任何人都可以闡明這一點嗎?

在覆蓋controller工廠時應該做什么樣的處理才能避免此類問題?

這不是因為MVC如何處理對jquery.js的請求,因為IIS處理對jquery.js的請求的方式。 IIS假定.js,.jpg等資源都是靜態資源,因此不需要通過ASP.NET引擎傳遞它們。 為了防止這種情況發生,您可以在web.config中添加一行,以獲取希望IIS單獨保留的路徑。

<system.webserver>
    <handlers>
    <add name="scripts" path="/Scripts/*" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0"/>
    </handlers>
</system.webserver>

添加類似的東西應該允許您的JS文件通過ASP.NET提供,而不是直接通過IIS提供。

經過一番研究后,我發現了史蒂文桑德森的書中的以下引用:

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

相反,如果您希望路由配置優先於磁盤上的文件,則可以將RouteCollection的RouteExistingFiles屬性設置為true。 (默認情況下是假的。)

這是非常有趣的東西,讓我了解實際問題。 一個更簡單的一個。 事實上,文件夾中沒有相關的腳本。 至少不是在視圖上請求完全相同版本的那些。 這是負責Asp.Net MVC認為它是一個控制器/動作請求。

參考: http//forums.asp.net/t/1536510.aspx/1

檢查在您的鏈接或腳本之前使用“~/”,例如:src="~/assets/js/main.js"

暫無
暫無

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

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