如何确保永远不会缓存动态生成的javascript文件?

时间:2010-07-17 10:27:27

标签: javascript asp.net-mvc caching outputcache

我有一个动态生成的javascript文件,我想确保它不会被浏览器缓存。我目前的方法是在每个页面视图的脚本标记中简单地将(新)guid附加到url。

例如:

<script type="text/javascript" src="/js/dynamic.js?rand=979F861A-C487-4AA8-8BD6-84E7988BD460"></script>

我的问题是......这是实现目标的最佳途径吗?

作为参考,我使用的是ASP.NET MVC 2,并且由于控制器操作而生成了javascript文件。

6 个答案:

答案 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,而不仅仅是查询参数)。