我在IIS中托管了一个ASP.NET MVC网站。 有时我推送更改,用户的浏览器可能仍然使用以前的文件,导致功能问题。 这是因为浏览器正在缓存这些文件吗? 我该怎么做才能确保用户浏览器加载更新的文件?
谢谢!
答案 0 :(得分:1)
这是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"));
}
}
答案 1 :(得分:1)
最简单的方法是在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 / last-modified建议很好,但没有解决“告诉”浏览器存在新版本文件的问题。