在我的應用程序中,用戶可以選擇修改其網站的CSS。輸出緩存動態生成CSS
這種情況不太可能經常發生變化,但是當它發生時,我們需要確保他們及其網站訪問者立即看到結果。
我們記錄了用戶更新其CSS的日期和時間,因此一個簡單的解決方案就是將時間戳附加到URL。
但是,我想知道是否可以通過編程方式設置緩存標頭,以便強制瀏覽器在發生更改時重新請求CSS文件。
在我的應用程序中,用戶可以選擇修改其網站的CSS。輸出緩存動態生成CSS
這種情況不太可能經常發生變化,但是當它發生時,我們需要確保他們及其網站訪問者立即看到結果。
我們記錄了用戶更新其CSS的日期和時間,因此一個簡單的解決方案就是將時間戳附加到URL。
但是,我想知道是否可以通過編程方式設置緩存標頭,以便強制瀏覽器在發生更改時重新請求CSS文件。
如果包括散列您的網址,即
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將得到刷新,當它改變:
使用url散列,最糟糕的情況是客戶端不會將您的css放入緩存中,但用戶體驗不會改變,因爲它們總是獲取最新版本。
隨着到期日或最後修改日期,最壞的情況是,客戶得到的是舊版本,而這將改變用戶體驗:)
感謝馬修的迴應我使用的輸出緩存的組合版本號來處理緩存失效。
輸出緩存配置文件:
我創建了下面的擴展方法追加時間戳:
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
作爲最後修改日期。
請重新閱讀我的問題。我知道我可以附加一些東西到網址,但我想知道如何通過設置緩存標題來做到這一點。 –
這是不一樣的。緩存頭是響應的一部分。該網址啓動請求。 – mathieu
感謝您的更新回覆。客戶端是否不尊重緩存最後修改日期? –