如何让浏览器知道文件已经更新? ASP.NET MVC

时间:2010-06-10 15:19:52

标签: asp.net-mvc iis-7

我在IIS中托管了一个ASP.NET MVC网站。 有时我推送更改,用户的浏览器可能仍然使用以前的文件,导致功能问题。 这是因为浏览器正在缓存这些文件吗? 我该怎么做才能确保用户浏览器加载更新的文件?

谢谢!

2 个答案:

答案 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建议很好,但没有解决“告诉”浏览器存在新版本文件的问题。