Я делаю 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-адреса или обратной петли будет работать.