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