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