6

我們擁有混合應用程序,它仍沿着ASP.NET MVC運行傳統ASP的應用程序的一部分。我想在經典ASP中使用捆綁的JavaScript和樣式。經典ASP(或PHP等)中的ASP.NET MVC軟件包

在ASP.NET中,我們可以很好地使用捆綁的東西進行緩存,我們使用Script.Render,它將版本哈希添加到提取url。

事情是,這種方法當然是經典ASP中不可用。

我們可以使用直接從html <script src="bundles/js?v=<%=version%>"/>捆綁。版本變量是用於緩存清除(強制瀏覽器刷新)的經典ASP變量。它在版本之間改變。

問題是,如果傳統的ASP不給正確的哈希捆綁請求,MVC捆綁將返回標頭caching: no-caching,這將表明瀏覽器不緩存它。

你有什麼好主意嗎?經典的ASP可以計算出這個哈希值嗎?你可以告訴捆綁,以允許緩存沒有v =哈希?可以在啓動時從MVC傳輸v = hash嗎?我們有傳遞經典ASP和MVC之間的變量的機制,但是可以通過某種方式從MVC啓動代碼獲得哈希值。

+1

Hashing,Bundling,MVC?在[經典的ASP]? **你絕對和完全確定你在談論經典ASP **嗎? – Rafael

+1

我們使用ASP.NET MVC4和Classic ASP的混合應用程序,而我們慢慢遷移到ASP.NET MVC4。混合的東西工作得很好,因爲http,html和javascript都適用於這兩種。例如傳統的ASP頁面可以對ASP.NET MVC控制器執行jquery ajax調用並獲得純HTML輸出。 –

+2

相信我,我知道我在做什麼。 - 大錘。請重新考慮反對票,這是合法的問題。 –

回答

3

AardVark的狂野思想給了我一些想法,我自己想出了它。解決方案本身很簡單。

以下是任何可能需要類似解決方案的解決方案。

以後你在ASP.NET MVC(Global.asax.cs中或BundleConfig)註冊的包:

 List<string> bundleHtml = new List<string>(); 
     bundleHtml.Add(Scripts.Render("~/bundles/legacybase").ToString()); 
     bundleHtml.Add(Styles.Render("~/styles/legacycss").ToString()); 
     File.WriteAllLines(Server.MapPath("~/dyn_legacy_bundle.inc"), bundleHtml, System.Text.Encoding.UTF8); 

這將生成文件dyn_legacy_bundle.inc包含適當<script>標籤都有效,其中包括版本散列(如果啓用調試,則爲調試版本)。

在傳統的ASP(或一些淫PHP等):

<head> 
    <!--#include file="dyn_legacy_bundle.inc" --> 
</head> 

然後這將使用由ASP.NET在啓動時生成的文件,並使用附帶的CSS/JavaScript的。

消極的一點是,如果在運行時更改了捆綁文件,則不會更新此動態文件。這將導致捆綁包不被緩存。應用程序池回收將最終修復緩存,所以我認爲我們會接受它。如果你想辦法避免這種情況,請告訴我。

注意,這將與任何其他框架也(即PHP)工作

1

另一種選擇:

設置一個處理程序(即Bundles.ashx)

public void ProcessRequest (HttpContext context) { 
    context.Response.ContentType = "text/html"; 
    context.Response.Write(System.Web.Optimization.Styles.Render("~/css")); 
} 

從php:

echo file_get_contents("http://example.com/Bundles.ashx"); 

您可以使用查詢字符串來指定不同的捆綁包。

+0

file_get_contents是否實際通過HTTP請求獲取數據?這可能會導致性能和緩存等問題。 –