如何防止MSXML2.XMLHTTP返回缓存响应?Windows7下VBScript场景
我之前在Windows 7上开发WScript脚本时,正好碰到和你一模一样的问题:用MSXML2.XMLHTTP从公开FTP服务器拉文件,结果文件总是被缓存到C:\Users\user\AppData\Local\Microsoft\Windows\Temporary Internet Files\Content.IE5目录里,而且不管怎么用setRequestHeader设置缓存相关的头(比如Expires、Cache-Control)都完全无效。折腾了好一阵才找到靠谱的解决办法,分享给大家:
问题根源
MSXML2.XMLHTTP在处理FTP请求时,并没有遵循HTTP的缓存控制逻辑,而是直接复用了IE的缓存机制——它会根据请求的URL来判断是否读取缓存,而FTP协议本身并不支持HTTP的缓存控制头,所以你设置的Expires之类的参数根本不会生效。
最靠谱的解决方法:添加随机URL参数
既然缓存是基于URL匹配的,那我们只要让每次请求的URL看起来不一样就行。最简单的方式就是在FTP文件的URL末尾添加一个随机生成的参数,比如?r=随机数:
示例代码
原来的代码(会触发缓存):
Set objHTTP = CreateObject("MSXML2.XMLHTTP") objHTTP.open "GET", "ftp://your-ftp-server.com/target-file.txt", False objHTTP.send() ' 后续处理文件内容...
修改后的代码(避免缓存):
Set objHTTP = CreateObject("MSXML2.XMLHTTP") ' 生成6位随机数作为唯一参数 randomSuffix = "?r=" & CStr(Int((999999 - 100000 + 1) * Rnd + 100000)) ' 拼接带随机参数的URL targetURL = "ftp://your-ftp-server.com/target-file.txt" & randomSuffix objHTTP.open "GET", targetURL, False objHTTP.send() ' 后续处理文件内容...
原理说明
每次请求的URL因为随机参数的存在都是唯一的,IE缓存找不到匹配的条目,就会强制从FTP服务器重新拉取最新的文件,完美绕开了缓存问题。这个方法不需要修改系统设置,也不会影响其他程序,是最安全的解决方案。
不推荐的备选方案:修改注册表禁用FTP缓存
如果你实在不想改代码,也可以通过修改注册表来禁用IE对FTP的缓存,但这个操作会影响整个系统的IE行为,不建议在生产环境或多人使用的机器上操作:
- 打开注册表编辑器(
regedit.exe) - 定位到
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings - 添加一个DWORD值
DisableFTPCache,设置值为1 - 重启机器生效
内容的提问来源于stack exchange,提问作者Steve Wasiura

