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-адресу.