2

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

例如:

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

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

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

4

6 回答 6

6

您使用的方法效果很好,另一种方法是使用DateTime.UtcNow.Ticks. 您当然可以使用缓存控制标头,但如果您想绝对确定,您所拥有的方法就是要走的路。

但是,如果您无论如何都要动态生成文件,并且需要将其包含在页面中......有什么理由不只是将 JavaScript 粘贴在页面中?由于您希望它永远不会缓存,因此这将为客户端节省往返时间。

于 2010-07-17T10:30:27.273 回答
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()
{
    ...
}

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

于 2010-07-17T10:34:20.320 回答
0

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

于 2010-07-17T10:31:04.897 回答
0

您可以考虑使用HTTP Etags

于 2010-07-17T10:32:01.537 回答
0

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

就像是<script src="{unique string}.js">

于 2010-07-17T10:32:21.117 回答
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,而不仅仅是查询参数)。

于 2010-07-17T10:47:48.887 回答