我有一个动态生成的javascript文件,我想确保它不会被浏览器缓存。我目前的方法是在每个页面视图的脚本标记中简单地将(新)guid附加到url。
例如:
<script type="text/javascript" src="/js/dynamic.js?rand=979F861A-C487-4AA8-8BD6-84E7988BD460"></script>
我的问题是......这是实现目标的最佳途径吗?
作为参考,我使用的是ASP.NET MVC 2,并且由于控制器操作而生成了javascript文件。
答案 0 :(得分:6)
您使用的方法很好,另一种方法是使用DateTime.UtcNow.Ticks
。您当然可以使用cache control headers,但如果您想绝对确定,那么您拥有的方法就是您的选择。
但是,如果您仍然动态生成文件,并且需要将其包含在页面中...任何理由不仅仅是在页面中粘贴JavaScript?由于您希望它从不缓存,这将为客户节省一次往返。
答案 1 :(得分:2)
您可以创建自定义操作属性:
public class NoCacheAttribute : ActionFilterAttribute
{
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
var cache = filterContext.HttpContext.Response.Cache;
cache.SetExpires(DateTime.UtcNow.AddDays(-1));
cache.SetValidUntilExpires(false);
cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
cache.SetCacheability(HttpCacheability.NoCache);
cache.SetNoStore();
base.OnResultExecuting(filterContext);
}
}
然后用这个属性装饰生成javascript的控制器动作:
[NoCache]
public ActionResult MyAction()
{
...
}
在这种情况下,您不再需要附加的随机字符串。
答案 2 :(得分:0)
是的,这很好。我个人也是如此,但我使用时间戳来确保它始终是唯一的。
答案 3 :(得分:0)
您可以考虑使用HTTP Etags
答案 4 :(得分:0)
这是人们如何做到这一点的通常方式。您还可以更改每个请求的文件名,以确保完全正确。
类似于<script src="{unique string}.js">
答案 5 :(得分:0)
在响应中使用缓存控制HTTP标头。
Cache-Control: no-cache
(因此,这纯粹是服务器设置,无需编码。)
或者,当您使用ASP.NET MVC时,使用路由来忽略URL的最后一个元素,在HTML中
<script type="text/javascript" src="/js/dynamic.js/979F861A-C487-4AA8-8BD6-84E7988BD460"></script>
并使用MVC路由忽略后缀(即,使每个提供的HTML页面具有不同的脚本URL,而不仅仅是查询参数)。