VBScript: отключить кэширование ответа от сервера на запрос HTTP GET URL - PullRequest
11 голосов
/ 16 июня 2010

Я хочу отключить кэш, используемый, когда 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 документа:

Фрагмент CGI-скрипта Perl на стороне сервера, который возвращает ответ вызывающему клиенту, установите значение 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 ]

9 голосов
/ 16 июня 2010

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

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

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

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

5 голосов
/ 16 июня 2010

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

3 голосов
/ 19 октября 2011

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

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

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

...