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

Ste*_*n L 5 pdf asp.net-mvc google-chrome http-caching

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

我正在尝试制作Chrome(首先,然后是所有其他现代浏览器)使用本地客户端缓存来完成对PDF文档的简单GET请求,而无需通过服务器(当然不是第一次).我通过<object>在HTML中的元素上设置"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
Run Code Online (Sandbox Code Playgroud)

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

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

[OutputCache(Duration=60)]
Run Code Online (Sandbox Code Playgroud)

在我的控制器上.对此控制器的第一个请求 - 使用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:*
Run Code Online (Sandbox Code Playgroud)

第二个请求导致另一个到服务器的往返,响应更快(建议服务器端缓存?)但返回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:*
Run Code Online (Sandbox Code Playgroud)

对同一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:*
Run Code Online (Sandbox Code Playgroud)

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

或者,当我通过在<object>元素上设置"data"属性来显示PDF时,我做得不对吗?

Hav*_*unk 0

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

[OutputCache(Duration=60, Location = OutputCacheLocation.Client)]
Run Code Online (Sandbox Code Playgroud)

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

更多信息请参见MSDN OutputCacheLocation