я отправляю запрос, используя XmlHttpRequest a в MSXML > объект:
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: Определения полей заголовка < / а>:
Другие директивы позволяют пользовательскому агенту изменять базовый механизм истечения срока действия. Эти директивы МОГУТ быть указаны по запросу:
max-age
Указывает, что клиент готов принять ответ, возраст которого не превышает указанное время в секундах. Если не включена также директива maxstale, клиент не желает принимать устаревший ответ.
Что именно то, что я хочу.
Cache-Control: max-age=0
не совсем то, что я хочу, или объект MSXML XmlHttpRequest
содержит ошибки?
Обновить один
Это COM-объект MSXML XmlHttpRequest
:
- CLSID: {88d96a0a-f192-11d4-a65f-0040963251e5}
- ProgID: Msxml2.XMLHTTP.6.0
Обновление два
Директива max-age
добавляется клиентом для соблюдения всех кешей. Из RFC:
Поле общего заголовка Cache-Control используется для указания директив, которые ДОЛЖНЫ выполняться всеми механизмами кэширования в цепочке запросов / ответов. Директивы определяют поведение, предназначенное для предотвращения неблагоприятного воздействия кэшей на запрос или ответ. Эти директивы обычно переопределяют алгоритмы кеширования по умолчанию. Директивы кэша однонаправлены в том смысле, что наличие директивы в запросе не означает, что такая же директива должна быть указана в ответе.
Максимальный возраст не для сервера; для сервера это не имеет смысла. Он предназначен для всех систем кэширования между пользователем и сервером.
Обновление три
Если пользовательский агент реализует HTTP-кеш, он должен уважать
Cache-Control
заголовки запроса, установленные _ 15_ (например,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, похоже, не выполняет это требование.