VBScript:禁用从服务器到HTTP GET URL请求的响应缓存

时间:2010-06-16 16:57:09

标签: caching vbscript xmlhttprequest response

我想关闭在Windows机器上的应用程序中运行的VBScript对服务器进行URL调用时使用的缓存。我用什么函数/方法/对象来做这件事?

当第一次进行调用时,我的基于Linux的Apache服务器会从正在运行的CGI Perl脚本返回一个响应。但是,后续运行的脚本似乎使用了与第一次相同的响应,因此数据正在某处缓存。我的服务器日志确认在以后的那些时间内没有调用服务器,只是在第一次。

这就是我在做的事情。我在商业应用程序中使用以下代码(不想提及此应用程序,可能与我的问题无关):


With CreateObject("MSXML2.XMLHTTP")
  .open "GET", "http://myserver/cgi-bin/nsr/nsr.cgi?aparam=1", False
  .send
  nsrresponse =.responseText
End With

上面的对象是否有一个函数/方法来关闭缓存,或者我应该在创建URL之前调用一个方法/函数来关闭响应对象的缓存?

我在这里寻找解决方案:http://msdn.microsoft.com/en-us/library/ms535874(VS.85).aspx - 不够有用。在这里:http://www.w3.org/TR/XMLHttpRequest/ - 非常不友好,难以阅读。

我也试图强制不使用http标头设置和html文档标头元数据使用缓存:

服务器端Perl CGI脚本的片段,它将响应返回给调用客户端,将expiry设置为0.


    print $httpGetCGIRequest->header(
        -type    => 'text/html',
        -expires => '+0s',
        );

响应中的Http头设置发送回客户端:


<html><head><meta http-equiv="CACHE-CONTROL" content="NO-CACHE"></head>
<body>
response message generated from server
</body>
</html>

上面的http标头和html文档头设置都没有用,因此我的问题。

3 个答案:

答案 0 :(得分:9)

我认为XMLHTTP对象本身甚至不会实现缓存。

只要您拨打.send(),就会发送新的请求。缓存的全部意义在于避免发送请求,但这不会发生(就您的代码示例而言)。

如果在某种浏览器中使用该对象,那么浏览器可能会实现缓存。在这种情况下,常见的方法是在语句中包含一个缓存断开器:每次发出新请求时更改的随机URL参数(例如,将当前时间附加到URL)。

或者,您可以让服务器发送Cache-Control: no-cache, no-store HTTP标头,看看是否有帮助。

<meta http-equiv="CACHE-CONTROL" content="NO-CACHE>可能没用,您可以完全放弃它。

答案 1 :(得分:5)

您可以使用WinHTTP,它不会缓存HTTP响应。您仍应使用SetRequestHeader方法添加缓存控制指令(Cache-control:no-cache),因为它指示中间代理和服务器不返回先前缓存的响应。

答案 2 :(得分:3)

如果您可以控制XMLHTTP请求所针对的应用程序(在您的情况下也是如此),您可以让它在响应中发送no-cache标头。这解决了我的问题。

Response.AppendHeader("pragma", "no-cache");
Response.AppendHeader("Cache-Control", "no-cache, no-store");

作为替代方案,您还可以将包含随机数的查询字符串附加到每个请求的网址。