Жесткое обновление и кэширование XMLHttpRequest в Internet Explorer / Firefox - PullRequest
7 голосов
/ 21 июля 2011

Я делаю Ajax-запрос, в котором я устанавливаю кешируемость ответов и последние измененные заголовки:

if (!String.IsNullOrEmpty(HttpContext.Current.Request.Headers["If-Modified-Since"]))
{
    HttpContext.Current.Response.StatusCode = 304;
    HttpContext.Current.Response.StatusDescription = "Not Modified";
    return null;
}
HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.Public);
HttpContext.Current.Response.Cache.SetLastModified(DateTime.UtcNow);

Это работает как ожидалось. В первый раз, когда я делаю запрос Ajax, я получаю 200 OK. Второй раз я получаю 304 Not Modified.

Когда я жестко обновляюсь в Chrome (Ctrl + F5), я получаю 200 OK - фантастика!

Когда я жестко обновляюсь в Internet Explorer / Firefox, я получаю 304 Not Modified. Однако любой другой ресурс (JS / CSS / HTML / PNG) возвращает 200 OK.

Причина в том, что заголовок «If-Not-Modified» отправляется для XMLHttpRequest независимо от жесткого обновления в этих браузерах. Я считаю, что Стив Соудерс документирует это здесь .

Я пытался установить ETag и кондиционирование на «If-None-Match», но безрезультатно (это упоминалось в комментариях на странице Стива Соудерса).

У кого-нибудь есть здесь драгоценности мудрости?

Спасибо, Ben

Обновление

Я мог бы проверить «If-Modified-Since» по сохраненной дате последнего изменения. Однако, надеюсь, этот вопрос поможет другим пользователям SO, которые считают, что заголовок установлен неправильно.

Обновление 2

Пока запрос отправляется с заголовком «If-Modified-Since» каждый раз. Internet Explorer даже не сделает запрос, если срок действия не установлен или установлен на будущую дату. Бесполезно!

Обновление 3

Теперь это может быть живой блог. Internet Explorer не удосуживается сделать второй запрос, когда localhost. Использование реального IP-адреса или обратной петли будет работать.

Ответы [ 2 ]

2 голосов
/ 30 июля 2011

До IE10 IE не применяет флаги обновления (см. http://blogs.msdn.com/b/ieinternals/archive/2010/07/08/technical-information-about-conditional-http-requests-and-the-refresh-button.aspx) к запросам, которые не выполняются при загрузке документа.

Если вы хотите, вы можете настроить целевой URL-адрес так, чтобы он содержал одноразовый номер, чтобы предотвратить выполнение кэшированной копии в будущем запросе. В качестве альтернативы вы можете отправить max-age = 0, чтобы заставить IE условно подтверждать ресурс перед каждым повторным использованием.

Что касается того, почему браузер повторно использует кэшированный ресурс, для которого не указано время жизни, см. http://blogs.msdn.com/b/ie/archive/2010/07/14/caching-improvements-in-internet-explorer-9.aspx

0 голосов
/ 10 февраля 2012

Решением, с которым я столкнулся для согласованного контроля, было управление заголовками кэша для всех типов запросов.

Итак, я принудил стандартные запросы так же, как и XMLHttpRequests, что указывало IE на использование следующей политики кэширования: Cache-Control: private, max-age = 0.

По какой-то причине IE не обрабатывал заголовки для различных типов запросов.Например, моя политика кэширования для стандартных запросов по умолчанию для браузера и для XMLHttpRequests была установлена ​​на вышеупомянутую политику управления.Тем не менее, отправляя запрос к чему-то вроде / url в качестве стандартного запроса get, визуализируйте результат правильно.К сожалению, выполнение того же запроса к / url, что и XMLHttpRequest, даже не попадет на сервер, поскольку запрос get был кэширован, а XMLHttpRequest достиг того же URL-адреса.

Итак, либо принудительно применяйте политику кэширования на всех фронтахили убедитесь, что вы используете разные точки доступа (uri) для своих типов запросов.Мое решение было прежним.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...