2010-07-14 27 views
3

當進行網頁製作時,客戶端/瀏覽器決定是否更新文件,如圖像或.css或.js,或者是否從緩存中獲取。ASP.NET:如何執行Web靜態文件的重新加載

在.aspx頁面的情況下,它是決定的服務器。

當然,在IIS級別上或者也使用一些HttpModule技術,我可以更改請求的標頭以告訴客戶端應該緩存文件的時間和長度。

現在,我確實有一個網站,其中.aspx與相應的.js結伴而行。所以,也許我在.js中有一些訪問.aspx中元素的jQuery代碼。如果我從.aspx中刪除該元素,我也會修改.js。如果用戶轉到我的頁面,他會得到新的.aspx,但他仍然可能會得到舊的.js,導致有趣的效果。

我的網站使用大量的腳本和大量的圖像。出於性能原因,我在IIS中配置了這些文件「永不」過期。

現在,文件不時發生變化,我想確保用戶獲得更新文件。

在一開始,我通過重命名文件來幫助自己。所以,我有SkriptV1.js和SkriptV2.js等等。這是關於最糟糕的選擇,因爲存儲庫歷史記錄已損壞,我需要調整引用和文件名。

現在,我在這裏進行了改進,僅使用Skript.js?v = 1或Skript.js?v = 2更改了引用。 這會強制客戶端刷新文件。它工作正常,但我仍然需要修改引用。

現在,有進一步改善這裏是這樣的:

<script type='text/javascript' src='../scripts/<%# GetScriptLastModified("MyScript.js") %>'></script> 

因此, 「GetScriptLastModified」 將追加V =參數是這樣的:

protected string GetScriptLastModified(string FileName) 
{ 
    string File4Info = System.Threading.Thread.GetDomain().BaseDirectory + @"scripts\" + FileName; 
    System.IO.FileInfo fileInfo = new System.IO.FileInfo(File4Info); 
    return FileName + "?v=" + fileInfo.LastWriteTime.GetHashCode().ToString(); 
} 

因此,渲染。 js-Link看起來像這樣的客戶端:

<script type='text/javascript' src='/scripts/GamesCharts.js?v=1377815076'></script> 

鏈接將改變每次,當我uplo廣告一個新版本,我可以確定,當我改變它時,用戶立即得到一個新的腳本或圖像。

現在有兩個問題: a)有沒有更好的方法來實現這個目標? b)如果沒有:有人猜測服務器的性能開銷有多大?在一個頁面上可以容易地創建50個版本化的元素,因此對於一個.aspx,GetScriptLastModified將被調用50次。

期待討論:)

回答

0

這個問題有幾個不同的答案。首先,如果您有一段時間只更改一次的文件,請將Expires和Cache-Control標題設置爲在一年內過期。只有當文件真的從未過期,你應該說他們永不過期。你現在看到說「永不過期」的問題。另外,如果您的網站上存在性能問題,無法提供大量圖像和JavaScript,則普遍接受的解決方案是使用CDN(內容分發網絡)。有很多不同的提供商,我相信你可以找到一個符合你的預算。從長遠來看,您還可以節省資金,因爲CDN將從IIS中減少大量的I/O和CPU時間。令人驚訝的是它可以帶來多大的差異。

最後,確保用戶獲得文件的最新版本的方法幾乎不會改變,即在您的資產URL中實施某種版本控制方案,以實現緩存清除。有很多不同的方法可以做到這一點,但一種(非常天真)的方式是每次部署到您的網站時增加一個版本號。

E.g.您的所有資產URL將看起來像/static/123/img/dog_and_pony.jpg

然後,下一次部署到您的站點時,您會增加版本號以使其爲「124」。您需要一些方法來跟蹤版本,將其動態注入到資產URL中,並確保每次部署時都會更改版本號。這個想法是任何引用這個資產的東西都應該自動知道新的版本號。

在性能方面,從不需要用戶刷新或不得不下載相同的東西兩次是令人欽佩的目標。但是有時候這樣做會更簡單,而且如果用戶只是定期刷新所有內容,那麼對於大多數網站來說,這可能就沒有問題了。

希望這會有所幫助。

相關問題