asmx / js的缓存不会持久化

时间:2012-02-24 15:03:58

标签: javascript caching proxy asmx

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

我使用下面的代码来实现这一目标。实际上我的要求是将这个调用(GetMygrid.asmx / js)缓存在浏览器缓存中几天,并避免304响应。我可以使用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响应。

  

Cache-Control:public

     

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

     

Last-Modified:Wed,22 Feb 2012 04:52:11 GMT

     

服务器:Microsoft-IIS / 7.5

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

  

缓存控制:私有

     

Content-Type:application / x-javascript;字符集= UTF-8

     

内容编码:gzip

     

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

     

Last-Modified:Wed,22 Feb 2012 04:39:37 GMT

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

不明白为什么会这样。

有人可以帮帮我吗?

1 个答案:

答案 0 :(得分:1)

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

据我所知,当首次请求JS时(在会话中虽然可能是应用程序生命周期),脚本模块会在内容块上设置“Expire”标头。您可能没有注意到的是,在第一种情况下,您对“SetExpires”的调用被默默忽略...该方法的内部[未记录我可能添加]只允许您设置过期标题If和Only如果新的到期日期早于当前设定的日期...因为'现在+ 5天'不早于一年前,它实际上并没有设定!

所有其他调用(我认为)在第一个调用之后都没问题,因为无论模块提供这些脚本代理,都不会在304s上再次设置过期,因此您对SetExpires的调用被认为是'Ok'。

我不明白是什么原因导致第一个'.asmx / js'调用在浏览器仍然有一个缓存副本时会重新进行调用,其中包含未来的本地到期时间:(

令人讨厌的是,HttpCachePOlicy类是密封的,所以我一直无法解决它:((首先放置你的模块不会起作用,因为SetExpires会成功使用你之后调用的脚本模块)

我应该补充一点,这种行为会“有意义”,因为这意味着脚本代理将从不过时,因为它们将始终被重新请求...不幸的是,304s是变得非常昂贵,我可以忍受它过时,所以想要控制这种行为......;)