Asp.net mvc 如何让浏览器知道文件已更新?ASP.NETMVC

Asp.net mvc 如何让浏览器知道文件已更新?ASP.NETMVC,asp.net-mvc,iis-7,Asp.net Mvc,Iis 7,我有一个ASP.NETMVC网站托管在IIS中。 有时我推送更改,用户的浏览器可能仍然使用以前的文件,导致功能问题。 这是因为浏览器正在缓存这些文件,对吗? 如何确保用户浏览器加载更新的文件 谢谢 如果不匹配(或未修改),那么这就是HTTP 304解析的用途 如果发送的文件带有ETag头和可接受的缓存策略,则浏览器将缓存该文件,并且对于每个后续请求,将发送If None Match头 web服务器应检查生成的文件ETag是否与If None Match请求匹配,并返回包含新内容的HTTP 200

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

谢谢

如果不匹配(或未修改),那么这就是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"));
    }
}

最简单的方法是在URL上附加一个日期或版本号作为查询字符串。比如:

<link rel="stylesheet" href="http://mysite.com/styles.css?2010-06-10-0700">


浏览器将请求新文件,因为URL不同。服务器将忽略查询字符串(除非您正在做一些聪明的事情)


etag/last modified建议很好,但不能解决“告诉”浏览器文件有新版本的问题。

谢谢您的回复。那么,我是否在更新的控制器中设置响应的状态代码?(对不起,不理解ETag的内容)如果更新的文件是js或css呢?嗯,.js和.css文件通常由web服务器直接发送,而不是通过ASP。您必须在IIS设置下配置可缓存性。也就是说,您可能需要降低缓存时间,并使用ETag。+1:是的,我有点跳过了缓存失效这一方面。
<script type="text/javascript" src="http://mysite.com/js/main.js?v1234"></script>