VBScript: отключить кэширование ответа с сервера на запрос HTTP GET URL

Я хочу отключить кэш, используемый при вызове URL-адреса на сервер из VBScript, запущенного в приложении на машине Windows. Какую функцию / метод / объект я использую для этого?

когда вызов выполняется в первый раз, мой сервер Apache на базе Linux возвращает ответ из сценария 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-документа не работали, поэтому мой вопрос.

3 ответов


Я не думаю, что объект XMLHTTP даже реализует кэширование.

вы отправляете новый запрос, как только вы позвоните .send() на нем. Весь смысл кэширования заключается в том, чтобы избежать отправки запросов, но этого не происходит здесь (насколько ваш образец кода идет).

но если объект используется в каком-то браузере, затем браузер может реализовать кэширование. В этом случае общий подход состоит в том, чтобы включить Cache-breaker в оператор: случайный параметр URL, который вы меняете каждый раз, когда делаете новый запрос (например, добавляя текущее время к URL).

кроме того, вы можете сделать свой сервер отправить Cache-Control: no-cache, no-store HTTP-header и посмотреть, поможет ли это.

на <meta http-equiv="CACHE-CONTROL" content="NO-CACHE> вероятно, бесполезно, и вы можете полностью отказаться от него.


можно использовать WinHTTP, который не кэширует HTTP-ответы. Вы все равно должны добавить директиву управления кэшем (Cache-control: no-cache), используя SetRequestHeader метод, поскольку он указывает промежуточным прокси и серверам не возвращать ранее кэшированный ответ.


Если у вас есть контроль над приложением, целевым запросом XMLHTTP (что верно в вашем случае), вы можете позволить ему отправлять заголовки без кэша в ответе. Это решило проблему в моем случае.

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

в качестве альтернативы вы также можете добавить строку запроса, содержащую случайное число, к каждому запрошенному url-адресу.