我正在使用 MSXML 的XmlHttpRequest对象发出请求:
IXMLHttpRequest http = new XmlHttpRequest();
http.open("GET", "http://www.bankofcanada.ca/stat/fx-xml.xml", False, "", "");
http.send();
成功了send
,我得到了我的 xml 数据。
除了XmlHttpRequest
没有实际访问网络(我可以看到没有发出实际的 http 请求)。Process Monitor 显示该文件实际上是从我的缓存中提供的:
所以我想告诉XmlHttpRequest
用户代理任何超过 0 秒的缓存内容都太旧了。执行此操作的标准方法是添加请求标头:
Cache-Control: max-age=0
发送请求:
http = new XmlHttpRequest();
http.open("GET", "http://www.bankofcanada.ca/stat/fx-xml.xml", False, "", "");
http.setRequestHeader("Cache-Control", "max-age=0");
http.send();
成功了send
,我得到了我的 xml 数据。
除了XmlHttpRequest
没有实际访问网络(我可以看到没有发出实际的 http 请求)。Process Monitor 显示该文件实际上是从我的缓存中提供的。
那么有什么问题呢?是max-age
不是在做我认为的事情?
来自RFC 2616 - 超文本传输协议,第 14 部分:标头字段定义:
其他指令允许用户代理修改基本过期机制。这些指令可以在请求中指定:
max-age
表示客户端愿意接受年龄不大于指定时间(以秒为单位)的响应。除非 maxstale 指令也包括在内,否则客户端不愿意接受过时的响应。
这正是我想要的。
不Cache-Control: max-age=0
正是我想要的,还是 MSXML 的XmlHttpRequest
对象有问题?
更新一
这是 MSXML XmlHttpRequest
COM 对象:
- CLSID:{88d96a0a-f192-11d4-a65f-0040963251e5}
- 程序 ID:Msxml2.XMLHTTP.6.0
更新二
该max-age
指令由客户端添加,以使所有缓存都遵守。来自 RFC:
Cache-Control 通用标头字段用于指定 请求/响应链上的所有缓存机制必须遵守的指令。这些指令指定旨在防止缓存对请求或响应产生不利影响的行为。这些指令通常会覆盖默认缓存算法。缓存指令是单向的,因为在请求中存在指令并不意味着要在响应中给出相同的指令。
Max-age 不适用于服务器;对服务器来说毫无意义。它适用于用户和服务器之间的所有缓存系统。
更新三
如果用户代理实现了一个 HTTP 缓存,它应该尊重
Cache-Control
由设置的请求头setRequestHeader()
(例如,Cache-Control: no-cache
绕过缓存)。除非最终用户明确请求此类行为(例如通过重新加载页面),否则它不得自动发送Cache-Control
或请求标头。Pragma
按照他们的示例,我尝试使用该no-cache
指令:
http = new XmlHttpRequest();
http.open("GET", "http://www.bankofcanada.ca/stat/fx-xml.xml", False, "", "");
http.setRequestHeader("Cache-Control", "no-cache");
http.send();
并且XmlHttpRequest
客户端仍然完全从缓存中服务请求,根本不查询服务器。
W3C 说,如果有缓存,它必须尊重Cache-Control
如果它是通过设置的setRequestHeader
。Microsoft 的 XmlHttpRequest 似乎没有满足这一要求。