代码之家  ›  专栏  ›  技术社区  ›  DanP

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

  •  2
  • DanP  · 技术社区  · 14 年前

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

    例如:

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

    我的问题是…这是实现我目标的最佳方式吗?

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

    6 回复  |  直到 14 年前
        1
  •  6
  •   Nick Craver    14 年前

    你的方法很好用,另一种方法是 DateTime.UtcNow.Ticks . 你当然可以用 cache control headers 但是如果你想成为 绝对肯定 你的方法就是要走的路。

    但是,如果您仍然在动态生成文件,并且需要将其包含在页面中……有什么理由不只是将javascript粘贴在页面中?既然你想这样 从未 缓存,这将为客户端节省一次往返。

        2
  •  2
  •   Darin Dimitrov    14 年前

    可以创建自定义操作属性:

    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()
    {
        ...
    }
    

    在这种情况下,您不再需要附加的随机字符串。

        3
  •  0
  •   bjg    14 年前

    你可以考虑使用 HTTP Etags

        4
  •  0
  •   dwich    14 年前

    这是人们通常的做法。您还可以更改每个请求的文件名以完全确定。

    类似的东西 <script src="{unique string}.js">

        5
  •  0
  •   Sarfraz    14 年前

    是的,很好。我个人也这么做,但我用 时间戳 而是确保它始终是唯一的。

        6
  •  0
  •   Richard    14 年前

    在响应中使用缓存控制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,而不仅仅是一个查询参数)。