2012-02-24 71 views
3

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

我用下面的代码来实现这一点。实际上,我的要求是将这个调用(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:公共

截止日期:星期一,2012年2月27日4时52分11秒GMT

的Last-Modified:星期三,2012 02月22日4时52分11秒GMT

服务器:Microsoft-IIS/7.5

但我的问题是,当我在app(关闭浏览器,然后登录)登录接下来的时间,这个缓存过期的d值改变回去一年。我正在使用GET方法进行此调用。

缓存控制:私人

内容类型:应用程序/ x-的JavaScript;字符集= UTF-8

内容编码:gzip

到期日:星期一,2011年2月21日15点35分48秒GMT

上次修改:星期三,2012 02月22日4时39分37秒GMT

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

不理解为什么会发生。

有人能帮我吗?

+0

如果您将InlineScript =“True”添加到页面上的服务参考,脚本将作为内联脚本。这减少了往返。但是,这意味着它们不会被包含在缓存中(如果您的缓存成功了,我还没有成功)。 – 2017-03-03 20:43:36

回答

1

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

从我可以告诉,当JS是“第一”的要求(在会话中尽管可能应用寿命)脚本模块在内容片上设置'Expire'标题。你可能没有注意到,你在第一种情况下默默地忽略了对'SetExpires'的调用...该方法的内部[我可能会添加未记录的]只允许您设置expires标头If and Only如果新的失效日期早于目前设定的失效日期...因为'现在+5天'并不早于一年前,所以它实际上并没有设定!

所有其他的呼叫(我认为)在第一个呼叫之后都可以接通,因为无论哪个模块提供这些脚本代理,都不会在304s上再次设置过期,因此您对SetExpires的呼叫被认为是“好”。

什么我不明白是什么原因导致这种第一”的.asmx/JS的呼吁重新制作时,浏览器仍然应该有一个未来的到期本地缓存副本给它:(

烦人HttpCachePOlicy类是密封的,所以我一直无法解决它:(:(先把你的模块不会工作,因为SetExpires会成功为您的脚本模块uf调用)

我应该补充说,这种行为使'意义',因为这意味着脚本代理将永不过时,因为他们将永远被重新请求...不幸的是,对我们来说,304s变得相当昂贵,我ca n生活在它过时的状态,所以想要对此行为进行一些控制...;)