我有一個ASP.NET託管在IIS中的ASP.NET MVC網站。 有時我推送更改並且用戶的瀏覽器仍可能使用以前的文件,從而導致功能問題。 這是因爲瀏覽器正在緩存這些文件嗎? 我能做些什麼來確保用戶瀏覽器加載更新的文件?如何讓瀏覽器知道文件已更新? ASP.NET MVC
謝謝!
我有一個ASP.NET託管在IIS中的ASP.NET MVC網站。 有時我推送更改並且用戶的瀏覽器仍可能使用以前的文件,從而導致功能問題。 這是因爲瀏覽器正在緩存這些文件嗎? 我能做些什麼來確保用戶瀏覽器加載更新的文件?如何讓瀏覽器知道文件已更新? ASP.NET MVC
謝謝!
做最簡單的事情是附加在URL作爲查詢字符串日期或版本號。喜歡的東西:
<link rel="stylesheet" href="http://mysite.com/styles.css?2010-06-10-0700">
或
<script type="text/javascript" src="http://mysite.com/js/main.js?v1234"></script>
,因爲URL是不同的瀏覽器將要求一個新的文件。服務器將忽略查詢字符串(除非你正在做一些聰明的事情)。
etag /上次修改的建議很好,但沒有解決「告訴」瀏覽器存在新版本文件的問題。
這就是ETag,If-None-Match(或If-Not-Modified)和HTTP 304 resopnses的用途。
如果使用ETag標頭和可接受的緩存策略發送文件,瀏覽器將緩存該文件,並且對於每個後續請求都會發送If-None-Match標頭。
Web服務器應檢查文件的生成ETag是否與If-None-Match請求匹配,並返回包含新內容的HTTP 200或指示緩存版本仍爲最新的HTTP 304。
這裏是我是如何在ASP.NET MVC 1.0使用它:
public ActionResult ViewAvatar(long id)
{
UserAvatar avatar = this.AppManager.GetUserAvatar(id);
if (avatar != null && true)
{
byte[] imageData = avatar.Avatar.ToArray();
string eTag = LanLordzApplicationManager.CalculateMd5(imageData);
if (this.Request.Headers["If-None-Match"] == eTag)
{
return this.NotModified(
HttpCacheability.Public,
DateTime.Now.AddMinutes(2)
);
}
string mimeType = this.AppManager.GetImageMimeType(imageData);
return this.Image(
imageData,
mimeType,
HttpCacheability.Public,
DateTime.Now.AddMinutes(2),
eTag
);
}
else
{
return this.HttpError(404, this.View("NotFound"));
}
}
感謝您的回覆。 那麼我應該在我更新的控制器中設置Response的狀態代碼嗎?(對不起,不瞭解這個ETag的東西) 如果更新後的文件是js或css,該怎麼辦? – fishiefishie 2010-06-10 15:25:49
那麼,.JS和.CSS文件通常由Web服務器直接發送,而不是通過ASP。您將不得不在IIS設置下配置緩存。也就是說,您可能需要降低緩存時間,並使用ETags。 – 2010-06-10 15:27:33
+1:是的,我已經略過了緩存失效的一面。 – 2010-06-11 00:47:50