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

来完成