Как получить If-Modified-начиная с работы с JQuery/JSON на IE?
Я работаю с особенно дорогой (с точки зрения запросов, а также пропускной способности), считаю ее каталогом товаров. Однако каталог также должен быть всегда полностью точным, то есть обновления каталога должны отражаться в режиме реального времени, поэтому фиксированный срок действия кэша не будет работать.
Каталог в настоящее время запрашивается клиентом с использованием JQuery 1.8.2, например, так:
$.ajax({
type: "POST",
contentType: "application/json; charset=utf-8",
url: "http://myserver.com/somejsonquery.aspx",
data: {},
dataType: "json",
success: function ( ... ) { ... },
error: function ( ... ) { ... }
});
И результат правильно отформатирован в JSON с типом контента "application/json".
Поскольку я поддерживаю надежный кеш на стороне сервера, я бы очень хотел реализовать семантику If-Modified-Since, чтобы мой сервер мог возвращать 304, когда кеш является текущим (без использования базы данных или сети), и отправлять только новый каталог для клиента, если перезагрузка произошла после отметки времени "If-Modified-Since".
Тем не менее, я испытываю затруднения, заставляя это работать (по крайней мере на IE). Я попытался установить следующее и все еще не мог заставить клиента отправлять If-Modified-Since:
- установите "cache: true" в запросе JSON
- заставить сервер вернуть HTTP-заголовок "Cache-control: private" в ответе
Кто-нибудь с каким-либо пониманием этого?
В качестве продолжения я также задаюсь вопросом, установлю ли я элемент управления Cache на "public" (т. Е. Кэшируемый прокси-серверами), будет ли сохраняться согласованность кэша через прокси-серверы? т.е. будет ли прокси-сервер возвращаться к моему серверу каждый раз, когда клиент запрашивает эту страницу. Если бы я включил кэширование прокси, я должен быть полностью уверен, что прокси будет гарантировать согласованное состояние кэша.
Я застрял на этом некоторое время, поэтому любая помощь будет оценена!
Спасибо, - К.
2 ответа
Получение заголовков кэша и т. Д., Чтобы они были совместимы с разными браузерами, не является точной наукой. Если вы не возражаете против попадания в сеть, попробуйте это.
1) Прикрепите уникальный идентификатор к своему каталогу и отправьте его клиенту, а также верните его в своем запросе ajax.
2) Проверьте, соответствует ли этот уникальный идентификатор самой обновленной версии вашего кэшированного каталога. Если это так, верните код ответа 304, иначе верните новый каталог вместе с новым уникальным идентификатором.
Мне удалось наконец понять это. Оказывается, мне нужно внести следующие изменения:
Клиентская часть jQuery:
- Используйте "GET" вместо "POST" в моем вызове AJAX. Похоже, что сообщения не должны быть кэшированы и по праву так.
- Забудьте о настройке "cache: true" в вызове AJAX - это не имеет значения, если вы хотите не использовать кеш браузера. Это имеет значение только в том случае, если вы хотите запустить свою собственную систему кэширования клиентов.
Сторона сервера:
- Всегда отправлять Last-Modified заголовок
- Всегда отправлять "Cache-control: private, max-age=1"
- Проверьте заголовок "If-Modified-Since" от клиента, если он не изменен, верните 304 без полезной нагрузки, иначе верните 200 с набором результатов.
Используя приведенную выше логику, я установил, что срок действия кэша браузера истекает через 1 секунду, и будет полагаться на сервер, который будет авторитетно решать, нужно ли возвращать новый каталог с использованием кода 304 в зависимости от ситуации. Кажется, работает очень хорошо на IE.
Пожалуйста, обратите внимание на комментарий Брэда о плохом поведении браузеров Apple. Поскольку лишь небольшая часть моих пользователей будет использовать мобильные устройства Apple, я решил сохранить кеширование браузера, поскольку преимущества слишком велики, чтобы его упускать, но постараюсь использовать особый случай, чтобы принудительно использовать "без кеша" только для мобильных браузеров Apple.,