2010-06-16 91 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。