有沒有辦法在執行時動態更新 asp.net mvc 包內容?
我的應用程序是 ASP.NET MVC v4,我正在使用 Web 優化功能(腳本和样式的捆綁和縮小)。
現在,我的理解是(如果有錯誤請糾正我),優化框架會在編譯時查看包含的文件並配置它們。它將根據內容創建一個版本號(v=something)。每次內容更改時,它都會重新創建版本雜湊,客戶端將獲得更新的文件。
現在,有沒有辦法完成以下工作
$$ 1 $$在我的伺服器中更新 js 文件中的某些內容,並將更新後的內容提供給客戶端,而無需重新建構和重新啟動應用程序(我沒有在此處更改捆綁配置,只是在腳本中更新文件內容)? $$ 2 $$更新腳本配置本身(例如,將新腳本添加到包中),並在不重新編譯和重新啟動應用程序的情況下將其提供給客戶端?或者,至少無需重新編譯?(我知道,通常我們在cs文件中定義bundle,但想知道是否有出路!) $$ 3 $$有沒有辦法使用我自己的版本號(比如來自配置文件,v=myCustomScriptVersion)而不是自動生成的版本雜湊?
有點晚了,但我只是在這里分享我自己的問題的經驗。
正如問題評論中所討論的,捆綁包被定義為cs文件的一部分(通常是App_Start中的BundleConfig.cs)。因此,捆綁包是在編譯時定義的,在應用程序啟動時,它們將被添加到集合中並變得可用。
現在,有趣的一點。在執行時,優化框架查看包含的文件並創建內容的雜湊,並將其作為版本查詢字元串附加到捆綁請求中。因此,當呼叫捆綁包時,生成的 uri 如下所示。
http://example.com/Bundles/MyBundledScripts?v=ILpm9GTTPShzteCf85dcR4x0msPpku-QRNlggE42QN81
這個版本號 v=… 是完全動態的。如果捆綁包中的任何文件內容髮生更改,則將重新生成此版本,否則將保持不變。
現在來回答問題,
$$ 1 $$這是由框架自動完成的,無需為此做任何額外的事情。每次更改文件內容時,都會生成新的版本號,客戶端將獲得更新的腳本。 $$ 2 $$不可能。如果捆綁包中包含的文件發生更改,則必須重新編譯。 $$ 3 $$是的,它可以使用。自定義版本號可以添加如下。
@Scripts.Render("~/Bundles/MyBundledScripts?v=" + ConfigurationManager.AppSettings["ScriptVersion"])但是小心!這將刪除基於文件內容的自動版本控制。
此外,如果同一文件有多個版本可用,並且我們總是希望包含可用的最新版本,則可以通過在捆綁配置中包含 {version} 萬用字元輕鬆實現,如下所示。
bundles.Add(new ScriptBundle("~/Bundles/MyBundledScripts") .Include( "~/Scripts/Vendor/someScript-{version}.js" ));
/Scripts/Vendor因此,如果文件夾 someScript-2.3.js someScript-3.4.js中有 2 個腳本然後文件
someScript-3.4.js(更高版本)將自動包含在內。當一個新文件someScript-4.0.js添加到文件夾中時,它將提供給客戶端,而無需重新編譯/重新啟動。