2012-06-13 77 views
4

在我的應用程序中,用戶可以選擇修改其網站的CSS。輸出緩存動態生成CSS

這種情況不太可能經常發生變化,但是當它發生時,我們需要確保他們及其網站訪問者立即看到結果。

我們記錄了用戶更新其CSS的日期和時間,因此一個簡單的解決方案就是將時間戳附加到URL。

但是,我想知道是否可以通過編程方式設置緩存標頭,以便強制瀏覽器在發生更改時重新請求CSS文件。

回答

4

如果包括散列您的網址,即

http://server.example.com/styles/css.css?hash 

它會被加載時哈希值發生變化,因爲瀏覽器會在新的URL取,

版本1:

<style type="text/css" link="styles/css.css?hash=v1" /> 

版本2:

<style type="text/css" link="styles/css.css?hash=v2" /> 

客戶端緩存是客戶端問題,讓他們按照他們認爲合適的方式進行:新的URL意味着資源已更改,因此需要重新加載。由於不同的客戶端實現,使用緩存控制標頭保持相同的URL可能會導致您痛苦的世界。

如果你把緩存控制頭(最後一次修改,過期,ETAG),你不能確定你的CSS將得到刷新,當它改變:

  • 因爲激進的瀏覽器(或代理)緩存可以忽略不計那些。
  • 因爲您可能會在5月1日爲V1提供服務,並且有效日期爲6月1日,因此在5月15日將其更新爲V2,您的客戶必須等待15天才能獲得新版本。

使用url散列,最糟糕的情況是客戶端不會將您的css放入緩存中,但用戶體驗不會改變,因爲它們總是獲取最新版本。

隨着到期日或最後修改日期,最壞的情況是,客戶得到的是舊版本,而這將改變用戶體驗:)

+0

請重新閱讀我的問題。我知道我可以附加一些東西到網址,但我想知道如何通過設置緩存標題來做到這一點。 –

+0

這是不一樣的。緩存頭是響應的一部分。該網址啓動請求。 – mathieu

+0

感謝您的更新回覆。客戶端是否不尊重緩存最後修改日期? –

1

感謝馬修的迴應我使用的輸出緩存的組合版本號來處理緩存失效。

輸出緩存配置文件:

我創建了下面的擴展方法追加時間戳:

public static string AppendTimeStamp(this string src, DateTime lastModified) 
    { 
     if (string.IsNullOrEmpty(src)) 
      return src; 

     return string.Format("{0}?v={1}", src, lastModified.ToString("yyyyMMddHHmmss")); 
    } 

用法:

<link rel="stylesheet" href="@Url.Content("~/assets/usercss").AppendTimeStamp(CustomizationSettings.LastModified)"/> 

在你不案例」我想永遠緩存文件,你可以通過DateTime.UtcNow作爲最後修改日期。