2009-03-24 4 views
7

У любого из популярных в настоящее время браузеров есть особые проблемы с кешированием * Ответы XMLHttpRequest, о которых мне нужно знать?Какие у браузеров проблемы с кешированием ответов XMLHTTPRequest?

Я хотел бы иметь возможность включать запросы XMLHttpRequest на каждую страницу в качестве метода динамической загрузки контента (например, JSON) или поведения (например, eval() ed Javascript), относящегося к типу страницы, но хотел сделать что ресурсы, которые он получает с сервера, могут быть кэшированы, если сервер отправил правильные заголовки.

Я был заинтересован в том, чтобы читать this article which mentions, что браузеры, такие как Firefox 1.1, не кэшируют какой-либо контент, полученный с помощью XMLHTTPRequest, и что он всегда запрашивает новые данные, отправленные полностью (с помощью Cache-Control и без If-Modified-Since) независимо от заголовки, отправленные сервером.

Очевидно, что эта статья очень старая - я даже не помню Firefox 1.1; поэтому какие соображения мне нужно делать для популярных популярных браузеров и есть ли какие-то трюки, когда я конкретно хочу ответов на кеширование?

** Чтобы уточнить мой вопрос, кеширование, я имею в виду кеширование на стороне клиента, где сервер выдает информацию о свежести (в виде директивы Cache-Control: max-age или заголовок Expires:) и браузера хранит копию ответа в кеше вместе с датой истечения срока действия, так что будущие запросы на один и тот же ресурс, выпущенный с последующих страниц, могут быть удовлетворены из кеша браузера без необходимости каких-либо контактов с сервером. Все основные браузеры делают это правильно для большинства контента, но я слышал, что Firefox не может это сделать для содержимого XMLHttpRequest. Я спрашиваю, знает ли кто-нибудь о случаях, когда какой-либо из современных браузеров не кэширует ответы в соответствии с спецификацией при использовании XMLHttpRequest. *

+0

это лучше, и более последовательно контролировать его в вас JS. если вам не нужно обновлять, не запрашивайте. – Javier

+0

Как вы это понимаете? Не могли бы вы привести пример? Я хотел бы получить что-то с сервера, но если браузер имеет его в кеше с предыдущей страницы, и он не истек, для того, чтобы он не мог вызвать отключение сервера. Я все еще хочу данные, хотя я не могу просто не запросить. – thomasrutter

ответ

11

Mark Nottingham имеет an excellent set of functional tests, которые демонстрируют поведение кэширования браузера XMLHttpRequest. Загрузите страницу в браузерах, которые вы хотите поддержать, и определите, какие методы вы можете и не можете полагаться, чтобы ваш ответ был кэширован.

+0

Большое спасибо за это. Это выглядит довольно многообещающим, поскольку Firefox действительно прошел те тесты «свежести» (включая все те, у которых «Expire»). – thomasrutter

+3

скрипт больше не работает. протестирован в Chrome. много предупреждений о безопасности в консоли –

4

Хотя некоторые браузеры имеют разные значения по умолчанию (по умолчанию IE кэширует результаты от AJAX запросов, но Firefox по умолчанию не будет), все браузеры, о которых я знаю, будут подчиняться заголовкам http, например Cache-Control. Поэтому достаточно правильно настроить заголовки кеширования для своего приложения.

Вот пример:

public ActionResult SomeAction() 
    { 
     var model = [...]; 
     Response.AddHeader("Cache-Control", "no-cache"); 
     return Json(model); 
    } 

Теперь IE и Firefox оба ведут себя так же; они никогда не будут кэшировать результаты действия.

+0

Я бы не был так уверен. Кэш IE6 слишком агрессивный. Меня несколько раз укусили. если вы не хотите, чтобы запросы кэшировались, добавьте arandom postfix в URL-адрес (неиспользуемый параметр в порядке) – Javier

+0

К сожалению, это противоположность тому, что мне нужно - я хотел бы убедиться, что ответ _is_ кэширован. То есть, если браузер сможет удовлетворить запрос с предыдущим ответом от его кеша, который еще не истек, я бы хотел, чтобы он сделал это, и предупредил и должен был сделать запрос к исходному серверу вообще. – thomasrutter

+1

Хавьер, который будет работать, но он делегирует политику кэша клиенту, что является ИМХО неправильным местом для него. –

Смежные вопросы