Аппаратное обновление и кеширование XMLHttpRequest в Internet Explorer / Firefox

Я делаю запрос 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» (это было упомянуто в комментариях на странице Стива Содерса)

Есть ли здесь у кого-нибудь сокровища мудрости?

Спасибо, Бен

Обновление

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

Обновление 2

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

Обновление 3

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

7
задан 21 July 2011 в 13:16
поделиться