2010-06-16 156 views
6

我想关闭在Windows计算机上的应用程序中运行的VBScript调用服务器的URL时使用的缓存。我用什么函数/方法/对象来做到这一点?VBScript:禁止缓存服务器对HTTP响应的URL响应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脚本响应返回到调用客户端的

片段设置有效期至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文件头设置h。没有工作,因此我的问题。

回答

5

我不认为XMLHTTP对象本身确实实现了缓存。

只要您拨打.send()就发送新的请求。整个缓存的目的是避免发送请求,但这不会发生在这里(就你的代码示例而言)。

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

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

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

+0

非常感谢您的时间Tomalak。我发现WinHttpRequest.5.1 COM对象不会缓存。但是,我将不得不做更广泛的测试以获得信心。为每个不同的URL提示+1 - 这绝对是一个值得考虑的提示 - 我可以像WinHttpRequest.5.1一样使用它,并扩展我们的服务器以处理额外的URL参数。我可能会包含一个高精度的请求时间字段,例如也许是毫秒。作为解决方案的一部分,这绝对值得考虑。 – therobyouknow 2010-06-17 08:54:16

+0

现在接受的答案,因为你的随机url建议命中路由的原因 - 缓存和打破这个,使代码被迫每次联系服务器。 – therobyouknow 2010-06-17 14:26:56

+1

要创建一个唯一的会话ID号,我使用VB函数中建立的日期和计时器,一个随机数,以及计算机名称/主机名,其中脚本Date给出今天的日期,Timer给出时间流逝的时间毫秒。随着随机数和机器ID,这应该使HTTP GET URL调用唯一。 2个相同的URL调用相同的机会是零。 – therobyouknow 2010-06-17 14:27:24

4

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

+0

因此,XMLHTTP对象*会缓存请求吗? – Tomalak 2010-06-16 17:25:22

+1

其实不,不应该,它支持你原来的观点。 – Garett 2010-06-16 17:32:05

+0

+1并回答。我查了一下WinHttp并使用了WinHttp.WinHttpRequest.5.1。经过一些额外的研究。你的建议为此提供了种子,称赞你。这是成功的,因为缓存不会发生。我现在需要做的是扩大我对这个脚本的测试(例如在不同的机器/配置上)以增加信心。为什么这个对象的默认缓存配置会因机器而异? – therobyouknow 2010-06-17 08:51:57

3

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

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

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