如何永久缓存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
应用程序中没有任何代码可以在登录期间重置缓存一年。
不明白为什么会这样。
有人可以帮帮我吗?
答案 0 :(得分:1)
我和你有同样的问题,我想出了一个理论;)
据我所知,当首次请求JS时(在会话中虽然可能是应用程序生命周期),脚本模块会在内容块上设置“Expire”标头。您可能没有注意到的是,在第一种情况下,您对“SetExpires”的调用被默默忽略...该方法的内部[未记录我可能添加]只允许您设置过期标题If和Only如果新的到期日期早于当前设定的日期...因为'现在+ 5天'不早于一年前,它实际上并没有设定!
所有其他调用(我认为)在第一个调用之后都没问题,因为无论模块提供这些脚本代理,都不会在304s上再次设置过期,因此您对SetExpires的调用被认为是'Ok'。
我不明白是什么原因导致第一个'.asmx / js'调用在浏览器仍然有一个缓存副本时会重新进行调用,其中包含未来的本地到期时间:(
令人讨厌的是,HttpCachePOlicy类是密封的,所以我一直无法解决它:((首先放置你的模块不会起作用,因为SetExpires会成功使用你之后调用的脚本模块)
我应该补充一点,这种行为会“有意义”,因为这意味着脚本代理将从不过时,因为它们将始终被重新请求...不幸的是,304s是变得非常昂贵,我可以忍受它过时,所以想要控制这种行为......;)