朋友们,
最近我在客户端托管了一个网站(使用 ASP.Net 开发),其中包含许多用于丰富 UI 交互的 JavaScript 内容。一切正常。但主要问题是——
当我对 JavaScript 文件进行一些更改并上传时,它不会在客户端生效,因为那里的网站采用本地缓存的 JavaScript 文件。
那么,我该如何避免这种情况呢?
有什么技术可以解决我的问题吗?
朋友们,
最近我在客户端托管了一个网站(使用 ASP.Net 开发),其中包含许多用于丰富 UI 交互的 JavaScript 内容。一切正常。但主要问题是——
当我对 JavaScript 文件进行一些更改并上传时,它不会在客户端生效,因为那里的网站采用本地缓存的 JavaScript 文件。
那么,我该如何避免这种情况呢?
有什么技术可以解决我的问题吗?
在 url 的末尾附加一些随机生成的数字/时间戳到 js 文件,如 -
经过一番研究,我们得出了以下似乎涵盖大多数浏览器的标头列表:
在 ASP.NET 中,我们使用以下代码段添加了这些:
Response.ClearHeaders();
Response.AppendHeader("Cache-Control", "no-cache"); //HTTP 1.1
Response.AppendHeader("Cache-Control", "private"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "no-store"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "must-revalidate"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "max-stale=0"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "post-check=0"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "pre-check=0"); // HTTP 1.1
Response.AppendHeader("Pragma", "no-cache"); // HTTP 1.0
Response.AppendHeader("Expires", "Mon, 26 Jul 1997 05:00:00 GMT"); // HTTP 1.0
发现自:http ://forums.asp.net/t/1013531.aspx
而不是只有script
标签来加载Javascript,动态加载它
<script>
function loadScript(name) {
var s = document.createElement("script");
s.src = name + "?" + (new Date).getTime();
document.body.appendChild(s);
}
loadScript("script1");
loadScript("script2");
</script>
请参阅此答案中有关缓存的注释: 使显示/隐藏更小
将缓存视为您的朋友。
有一些技术,例如避免浏览器使用缓存过期来缓存资源。
protected void Application_BeginRequest()
{
//NOTE: Stopping IE from being a caching whore
HttpContext.Current.Response.Cache.SetAllowResponseInBrowserHistory(false);
HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache);
HttpContext.Current.Response.Cache.SetNoStore();
Response.Cache.SetExpires(DateTime.Now);
Response.Cache.SetValidUntilExpires(true);
}
但是对于您的情况,这是不可取的,我假设您的项目处于开发阶段,并且为了避免cntrl + F5
重新加载资源并删除缓存资源并再次重新加载,您不应该实施此补救措施,因为这会减慢您的网站表现。
更简单,更合理的解决方案是告诉您的客户cntrl + F5
在他们想要查看站点的最新更改时进行合作并按下,之后站点完成时将不再需要这样做,或者您可以实现上面给出的代码仅在开发阶段,并在您的网站上线之前将其删除。