Javascript asmx/js的缓存未持久化
如何永久缓存asmx/js调用?我尝试使用HTTPModule并实现了缓存。但此缓存值将在下次登录时过期。它将重置为上次修改日期后一年。通过代码,我没有这样做。asmx中是否有任何默认设置用于执行此操作?如果是,是否有方法覆盖该设置 我使用下面的代码来实现这一点。实际上,我的要求是将这个调用(GetMygrid.asmx/js)缓存在浏览器缓存中几天,以避免响应。我可以使用HTTPModule缓存此调用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
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”对于页面上的服务引用,该脚本将作为内联脚本包含。这减少了往返。但是,这意味着它们将不会包含在缓存中(如果您使其成功工作,我还没有成功)。