Как получить 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.,

Другие вопросы по тегам