【发布时间】:2010-06-10 15:19:51
【问题描述】:
我有一个托管在 IIS 中的 ASP.NET MVC 网站。 有时我推送更改并且用户的浏览器可能仍在使用以前的文件,从而导致功能问题。 这是因为浏览器正在缓存这些文件吗? 如何确保用户浏览器加载更新的文件??
谢谢!
【问题讨论】:
标签: asp.net-mvc iis-7
我有一个托管在 IIS 中的 ASP.NET MVC 网站。 有时我推送更改并且用户的浏览器可能仍在使用以前的文件,从而导致功能问题。 这是因为浏览器正在缓存这些文件吗? 如何确保用户浏览器加载更新的文件??
谢谢!
【问题讨论】:
标签: asp.net-mvc iis-7
最简单的做法是在 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 建议很好,但没有解决“告诉”浏览器有新版本文件的问题。
【讨论】:
这就是 ETag、If-None-Match(或 If-Not-Modified)和 HTTP 304 响应的用途。
如果发送的文件带有 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"));
}
}
【讨论】: