jQuery / AJAX / Chrome / IIS:如何强制缓存重新验证(304)?

时间:2015-01-21 00:08:15

标签: jquery ajax google-chrome caching iis

在我的IIS服务器上,我有一个json文件,可以在一天到5分钟之间以可变频率进行更新。

第一次加载给出了200 OK,如预期的那样带有所有正确的标题。第二次加载等返回304 Not Modified,也如预期的那样。当文件被更改时,我得到一个200并且IIS重新上传文件,所有这些都按计划进行。

样本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)而没有文件传输(只是从缓存中获取文件),我从Chrome获得以下请求标头: Bad headers

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);}
});

1 个答案:

答案 0 :(得分:1)

如果没有缓存控制指令,浏览器可以随心所欲地执行操作。由于您的内容的更改时间不会超过5分钟,因此添加:

就足够了
Cache-Control: max-age=300

到你的标题。在下一页加载时,如果已经过了300秒,它将再次使用If-Modified-Since标题进行检查。

对于IIS中的静态文件,可以使用IIS7 Cache-Control

来完成此操作