我正在开发一个使用 HTML5 的小型单页应用程序。一个功能是显示嵌入在页面中的 PDF 文档,可以从列表中选择哪些文档。
现在我正在尝试让 Chrome(首先,然后是所有其他现代浏览器)使用本地客户端缓存来完成对 PDF 文档的简单 GET 请求,而无需通过服务器(当然第一次除外)。<object>
我通过在 HTML 中的元素上设置“数据”属性来请求 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)]
在我的控制器上。对该控制器的第一个请求 - 带有 URLhttp://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>
或者,当我通过在元素上设置“数据”属性来显示 PDF 时,我是否做得不对?