【问题标题】:How to let browsers know files have been updated? ASP.NET MVC如何让浏览器知道文件已更新? ASP.NET MVC
【发布时间】:2010-06-10 15:19:51
【问题描述】:

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

谢谢!

【问题讨论】:

    标签: asp.net-mvc iis-7


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

    【讨论】:

    • +1:是的,我有点跳过了缓存失效方面的内容。
    【解决方案2】:

    这就是 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"));
        }
    }
    

    【讨论】:

    • 感谢您的回复。那么我应该在更新的控制器中设置响应的状态代码吗?(对不起,不理解这个 ETag 的东西)如果更新的文件是 js 或 css 怎么办?
    • 嗯,.JS 和 .CSS 文件一般是由 Web 服务器直接发送,而不是通过 ASP。您必须在 IIS 设置下配置可缓存性。也就是说,您可能需要降低缓存时间,并使用 ETags。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-17
    • 1970-01-01
    • 1970-01-01
    • 2018-03-17
    • 2021-04-11
    相关资源
    最近更新 更多