Javascript asmx/js的缓存未持久化

Javascript asmx/js的缓存未持久化,javascript,caching,proxy,asmx,Javascript,Caching,Proxy,Asmx,如何永久缓存asmx/js调用?我尝试使用HTTPModule并实现了缓存。但此缓存值将在下次登录时过期。它将重置为上次修改日期后一年。通过代码,我没有这样做。asmx中是否有任何默认设置用于执行此操作?如果是,是否有方法覆盖该设置 我使用下面的代码来实现这一点。实际上,我的要求是将这个调用(GetMygrid.asmx/js)缓存在浏览器缓存中几天,以避免响应。我可以使用HTTPModule缓存此调用 private void EndRequest(object sender, EventAr

如何永久缓存asmx/js调用?我尝试使用HTTPModule并实现了缓存。但此缓存值将在下次登录时过期。它将重置为上次修改日期后一年。通过代码,我没有这样做。asmx中是否有任何默认设置用于执行此操作?如果是,是否有方法覆盖该设置

我使用下面的代码来实现这一点。实际上,我的要求是将这个调用(GetMygrid.asmx/js)缓存在浏览器缓存中几天,以避免响应。我可以使用HTTPModule缓存此调用

private void EndRequest(object sender, EventArgs e)
{
    HttpApplication application = (HttpApplication)sender;
    HttpContext context = application.Context;           

    var path = context.Request.Path.ToLower().Replace('\\', '/');

    if (path.EndsWith("/js") || path.EndsWith("/jsdebug") )
    {
        var lastModified = DateTime.UtcNow;
        var expires = lastModified + TimeSpan.FromDays(5);

        context.Response.Cache.SetLastModified(lastModified);
        context.Response.Cache.SetExpires(expires); 
        context.Response.Cache.SetCacheability(HttpCacheability.Public);

    }
}
当我多次访问特定页面时,此代码在运行时运行良好。(GetMygrid.asmx/js)访问页面并获取以下缓存头时,我没有收到304响应

缓存控制:公共

到期时间:2012年2月27日星期一04:52:11 GMT

最后修改时间:2012年2月22日星期三04:52:11 GMT

服务器:Microsoft IIS/7.5

但我的问题是,当我下次登录应用程序时(关闭浏览器,然后登录),此缓存过期,值更改为一年前的值。我正在使用
GET
方法进行此调用

缓存控制:专用

内容类型:应用程序/x-javascript;字符集=utf-8

内容编码:gzip

到期时间:2011年2月21日星期一15:35:48 GMT

最后修改时间:2012年2月22日星期三04:39:37 GMT

应用程序中没有任何代码可以在一年前登录时重置缓存

不明白为什么会这样


有人能帮我吗?

我和你有同样的问题,我提出了一个理论;)

据我所知,当JS是“第一个”请求时(在会话中,尽管可能是应用程序生命周期中),脚本模块会在内容块上设置“Expire”头。您可能没有注意到的是,在第一种情况下,您对“SetExpires”的调用被默默忽略。。。该方法的内部[un-documented I May add]仅允许您在且仅当新的到期日早于当前设置的到期日时设置expires标头。。。因为“现在+5天”并不早于一年前,所以它实际上没有被设置

在第一次调用之后,所有其他调用(我认为)都可以,因为提供这些脚本代理的任何模块都不会在304s上再次设置expires,因此您对SetExpires的调用被视为“ok”

我不明白的是,当浏览器仍然应该有一个缓存副本,并且该副本的本地到期日为:(

令人烦恼的是,HttpCachePOlicy类是密封的,因此我无法解决它:((将模块放在第一位不会起作用,因为SetExpires会成功地将脚本模块uf放在您的后面调用)

我要补充的是,这种行为是“有意义的”,因为这意味着脚本代理永远不会过时,因为它们总是会被重新请求…不幸的是,对我们来说,304s变得非常昂贵,我可以忍受它过时,因此希望对这种行为进行一些控制…;)

如果您添加InlineScript=“True”对于页面上的服务引用,该脚本将作为内联脚本包含。这减少了往返。但是,这意味着它们将不会包含在缓存中(如果您使其成功工作,我还没有成功)。