为什么Chrome会在这两种情况下使用不同的客户端缓存?

我正在研究一个使用HTML5的小型单页应用程序。 一个功能是显示嵌入在页面中的PDF文档,哪些文档可以从列表中选择。

NOw我试图让Chrome(首先,然后是所有其他现代浏览器)使用本地客户端缓存来完成对PDF文档的简单GET请求,而无需通过服务器(当然第一次除外)。 我通过在HTML中设置<object>元素的“data”属性来请求PDF文件。

我找到了一个XMLHttpRequest(不是<object> )的工作示例。 如果您使用Chrome的开发人员工具(“网络”选项卡),则可以看到第一个请求发送到服务器,并使用这些标头生成响应:

Cache-Control:public,Public
Content-Encoding:gzip
Content-Length:130
Content-Type:text/plain; charset=utf-8
Date:Tue, 03 Jul 2012 20:34:15 GMT
Expires:Tue, 03 Jul 2012 20:35:15 GMT
Last-Modified:Tue, 03 Jul 2012 20:34:15 GMT
Server:Microsoft-IIS/7.5
Vary:Accept-Encoding

第二个请求是从本地缓存中提供的,没有任何服务器往返,这正是我想要的。

回到我自己的应用程序中,然后我使用ASP-NET MVC 4进行设置

[OutputCache(Duration=60)]

在我的控制器上。 对该控制器的第一个请求(URL为http://localhost:63035/?doi=10.1155/2007/98732会生成以下标题:

Cache-Control:public, max-age=60, s-maxage=0
Content-Length:238727
Content-Type:application/pdf
Date:Tue, 03 Jul 2012 20:45:08 GMT
Expires:Tue, 03 Jul 2012 20:46:06 GMT
Last-Modified:Tue, 03 Jul 2012 20:45:06 GMT
Server:Microsoft-IIS/8.0
Vary:*

第二个请求导致到服务器的另一次往返,并且响应速度更快(建议使用服务器端缓存?),但返回200 OK,并返回以下标头:

Cache-Control:public, max-age=53, s-maxage=0
Content-Length:238727
Content-Type:application/pdf
Date:Tue, 03 Jul 2012 20:45:13 GMT
Expires:Tue, 03 Jul 2012 20:46:06 GMT
Last-Modified:Tue, 03 Jul 2012 20:45:06 GMT
Server:Microsoft-IIS/8.0
Vary:*

对同一个URL的第三个请求导致了另一个往返和304响应:

Cache-Control:public, max-age=33, s-maxage=0
Date:Tue, 03 Jul 2012 20:45:33 GMT
Expires:Tue, 03 Jul 2012 20:46:06 GMT
Last-Modified:Tue, 03 Jul 2012 20:45:06 GMT
Server:Microsoft-IIS/8.0
Vary:*

我的问题是 ,我应该如何设置OutputCache属性以获得所需的行为(即在初始请求的X秒内从客户端缓存完全填充PDF请求)?

或者,当我通过在<object>元素上设置“data”属性导致PDF显示时,我没有做正确的事情?


客户从来没有义务缓存。 每个浏览器都可以自由使用自己的启发式来决定是否值得缓存对象。 毕竟,高速缓存的任何使用都会与高速缓存的其他用途“竞争”。

缓存不是为了保证快速响应而设计的; 它的设计目的是平均增加未经更改的经常使用的资源已经存在的可能性。 你试图做什么,不是什么缓存旨在帮助。

根据您报告的结果,2012年使用的Chrome版本决定缓存60秒内过期的对象是毫无意义的,并且只需要一次。 所以它在使用它之后丢弃了第一个副本。 然后你又问了一次,它开始给这个URL多一点优先权 - 它必须记住最近的URL,并且观察到这是第二个请求 - 它将拷贝保存在缓存中,但是当第三个请求到来时,请服务器验证它仍然有效(大概是因为到期时间只有几秒钟)。 服务器说“304 - 没有修改 - 使用你缓存的副本”。 它没有再发送PDF。

恕我直言,这是合理的缓存行为,对于即将到期的对象。


如果您希望增加PDF延长时间的可能性,请提供稍后的到期时间,但请说明它必须与服务器进行核对以确定它是否仍然有效。

如果使用HTTP Cache-Control头,则可能是: private, max-age: 3600, must-revalidate 。 有了这个,你应该看到服务器的往返行程,只要该页面有效,它将给出304响应。 这应该是一个快速响应,因为没有数据被发回 - 使用浏览器的缓存版本。

private是可选的 - 与此缓存行为无关 - 我假设这种易失性PDF是什么,它只对给定的用户有意义,并且/或者不应该在一些共享的位置长时间闲置。


如果你真的需要不与服务器交谈的性能 ,那么就应该考虑编写javascript来隐藏/显示保存该PDF的DOM元素,而不是放弃它,并且需要再次询问它。

即使您目前没有向用户显示,您的页面的JavaScript代码也是“理解”您确实希望PDF仍然存在的唯一地方。


您是否尝试将OutputCache的Location属性设置为“Client”

[OutputCache(Duration=60, Location = OutputCacheLocation.Client)]

默认情况下,location属性设置为“Any”,这可能意味着响应缓存在客户端,代理或服务器上。

更多在MSDN OutputCacheLocation

链接地址: http://www.djcxy.com/p/36425.html

上一篇: Why does Chrome use the client cache differently in these two scenarios?

下一篇: Google Chrome Cancels 4xx Client Error Response