Я отправляю запрос, используя MSXML XmlHttpRequest объект:
IXMLHttpRequest http = new XmlHttpRequest();
http.open("GET", "http://www.bankofcanada.ca/stat/fx-xml.xml", False, "", "");
http.send();
И send
успешно, и я получаю свои данные XML.
За исключением того, что XmlHttpRequest
на самом деле не попал в сеть (я вижу, что фактический http-запрос не выдается). И Process Monitor показывает, что файл фактически обслуживается из моего кэша:
Итак, я хочу проинструктировать пользовательский агент XmlHttpRequest
, что любое кэшированное содержимое старше 0 секунд слишком старое. стандартный способ сделать это - добавить заголовок запроса:
Cache-Control: max-age=0
на запрос на отправку:
http = new XmlHttpRequest();
http.open("GET", "http://www.bankofcanada.ca/stat/fx-xml.xml", False, "", "");
http.setRequestHeader("Cache-Control", "max-age=0");
http.send();
И send
успешно, и я получаю свои данные XML.
За исключением того, что XmlHttpRequest
на самом деле не попал в сеть (я вижу, что фактический http-запрос не выдается). И Process Monitor показывает, что файл фактически обслуживается из моего кэша.
Так что не так? max-age
не делает то, что мне кажется?
С RFC 2616 - Протокол передачи гипертекста, часть 14: Определения полей заголовка :
Другие директивы позволяют пользовательскому агенту
изменить базовый механизм истечения.
Эти директивы МОГУТ быть указаны на
запрос:
Макс-возраст
Указывает, что клиент
готовы принять ответ, чей возраст
не больше указанного времени
в секундах Если не максимально
директива также включена, клиент
не желает принимать несвежую
ответ.
Что именно то, что я хочу.
Является ли Cache-Control: max-age=0
не совсем тем, что я хочу, или объект MSXML XmlHttpRequest
содержит ошибку?
Обновление Один
Это MSXML XmlHttpRequest
COM-объект:
- CLSID: {88d96a0a-f192-11d4-a65f-0040963251e5}
- ProgID: Msxml2.XMLHTTP.6.0
Обновление Два
Директива max-age
добавляется клиентом для всех кешей. Из RFC:
Поле общего заголовка Cache-Control
используется для указания директив, которые
ДОЛЖНЫ быть подчинены всему кешированию
механизмы вдоль запроса / ответа
цепь . Директивы определяют поведение
предназначен для предотвращения кэши от
неблагоприятно вмешиваясь в запрос
или ответ. Эти директивы
обычно переопределяет кэширование по умолчанию
алгоритмы. Директивы кэша
однонаправленный в том, что наличие
директива в запросе не
подразумевают, что та же самая директива должна быть
дано в ответе.
Макс-возраст не для сервера; это не имеет смысла для сервера. Он предназначен для всех систем кэширования между пользователем и сервером.
Обновление три
С W3C XmlHttpRequest :
Если пользовательский агент реализует кеш HTTP, он должен уважать
Cache-Control
заголовки запроса, установленные
setRequestHeader()
(например,
Cache-Control: no-cache
обходит
кэш). Это не должно отправить Cache-Control
или Pragma
заголовки запроса
автоматически, если конечный пользователь
явно запрашивает такое поведение
(например, перезагрузив страницу).
Следуя их примеру , я попытался использовать директиву no-cache
:
http = new XmlHttpRequest();
http.open("GET", "http://www.bankofcanada.ca/stat/fx-xml.xml", False, "", "");
http.setRequestHeader("Cache-Control", "no-cache");
http.send();
А XmlHttpRequest
клиент по-прежнему полностью обслуживает запросы из кэша, вообще не запрашивая сервер.
W3C говорит, что если есть кеш, он должен соблюдать Cache-Control
, если он установлен через setRequestHeader
. Microsoft XmlHttpRequest, похоже, не выполняет это требование.