jQuery / AJAX / Chrome / IIS:如何强制缓存 re-validation (304)?
jQuery / AJAX / Chrome / IIS: How to force cache re-validation (304)?
在我的 IIS 服务器上,我有一个 json 文件,它以可变频率更新,在一天到 5 分钟之间。
的第一次加载给了我预期的 200 OK headers。第二次加载等等 returns 304 Not Modified,也符合预期。当文件被更改时,我得到一个 200 和 IIS re-uploads 文件,一切都按计划进行。
示例 200 响应:
Accept-Ranges:bytes
Content-Encoding:gzip
Content-Type:application/json
Date:Tue, 20 Jan 2015 23:05:06 GMT
ETag:"604a75cb335d01:0"
Last-Modified:Tue, 20 Jan 2015 22:52:40 GMT
Server:Microsoft-IIS/7.5
Transfer-Encoding:chunked
Vary:Accept-Encoding
X-Powered-By:ASP.NET
示例 304 响应:
Accept-Ranges:bytes
Date:Tue, 20 Jan 2015 23:07:20 GMT
ETag:"604a75cb335d01:0"
Last-Modified:Tue, 20 Jan 2015 22:52:40 GMT
Server:Microsoft-IIS/7.5
X-Powered-By:ASP.NET
问题
在大约 4-6 次加载后,我开始在没有文件传输的情况下获得 200 OK (from cache)
(仅从缓存中获取文件)并且我从 [= 获得以下请求 Headers 51=]:
Chrome 没有向服务器发送请求,因此没有获得预期的 304(或 200 w/ 新文件下载)。
尝试次数
我无法使用 cache: false
,因为这不会触发我希望在文件未更新时发生的 304。
我尝试使用 ifModified: true
得到我想要的 304,但是 success()
函数接收 undefined
作为数据。
这是我正在使用的 ajax 电话:
$.ajax({
url: "currentData.json",
//cache: false, // Not using this because I'll never get 304
//ifModified: true, // Doesn't populate data in success()
success: function (data) {console.log(data);}
});
没有缓存控制指令,浏览器可以自由地做它想做的事。由于您的内容更改不会超过 5 分钟,因此添加以下内容应该就足够了:
Cache-Control: max-age=300
给你的 header。在下一个页面加载时,如果 300 秒过去了,它将再次检查 If-Modified-Since header.
对于 IIS 中的静态文件,这似乎可以使用 IIS7 Cache-Control
来完成
在我的 IIS 服务器上,我有一个 json 文件,它以可变频率更新,在一天到 5 分钟之间。
的第一次加载给了我预期的 200 OK headers。第二次加载等等 returns 304 Not Modified,也符合预期。当文件被更改时,我得到一个 200 和 IIS re-uploads 文件,一切都按计划进行。
示例 200 响应:
Accept-Ranges:bytes
Content-Encoding:gzip
Content-Type:application/json
Date:Tue, 20 Jan 2015 23:05:06 GMT
ETag:"604a75cb335d01:0"
Last-Modified:Tue, 20 Jan 2015 22:52:40 GMT
Server:Microsoft-IIS/7.5
Transfer-Encoding:chunked
Vary:Accept-Encoding
X-Powered-By:ASP.NET
示例 304 响应:
Accept-Ranges:bytes
Date:Tue, 20 Jan 2015 23:07:20 GMT
ETag:"604a75cb335d01:0"
Last-Modified:Tue, 20 Jan 2015 22:52:40 GMT
Server:Microsoft-IIS/7.5
X-Powered-By:ASP.NET
问题
在大约 4-6 次加载后,我开始在没有文件传输的情况下获得 200 OK (from cache)
(仅从缓存中获取文件)并且我从 [= 获得以下请求 Headers 51=]:
Chrome 没有向服务器发送请求,因此没有获得预期的 304(或 200 w/ 新文件下载)。
尝试次数
我无法使用 cache: false
,因为这不会触发我希望在文件未更新时发生的 304。
我尝试使用 ifModified: true
得到我想要的 304,但是 success()
函数接收 undefined
作为数据。
这是我正在使用的 ajax 电话:
$.ajax({
url: "currentData.json",
//cache: false, // Not using this because I'll never get 304
//ifModified: true, // Doesn't populate data in success()
success: function (data) {console.log(data);}
});
没有缓存控制指令,浏览器可以自由地做它想做的事。由于您的内容更改不会超过 5 分钟,因此添加以下内容应该就足够了:
Cache-Control: max-age=300
给你的 header。在下一个页面加载时,如果 300 秒过去了,它将再次检查 If-Modified-Since header.
对于 IIS 中的静态文件,这似乎可以使用 IIS7 Cache-Control
来完成