Отключение кэширования браузера для всех браузеров из ASP.NET
Я после окончательной ссылки на то, что код ASP.NET требуется для отключения кэширования страниц браузерами. Существует множество способов повлиять на заголовки HTTP и метатеги, и у меня сложилось впечатление, что для корректной работы разных браузеров требуются разные настройки. Было бы здорово получить комментарий с комментариями, чтобы указать, что работает для всех браузеров, а что требуется для конкретного браузера, включая версии.
Там есть огромное количество информации об этой проблеме, но мне еще предстоит найти хороший справочник, который описывает преимущества каждого метода и то, был ли конкретный метод заменен API более высокого уровня.
Я особенно заинтересован в ASP.NET 3.5 SP1, но было бы хорошо получить ответы и для более ранней версии.
Эта запись в блоге " Два важных различия между Firefox и IE Caching" описывает некоторые различия в поведении протокола HTTP.
Следующий пример кода иллюстрирует то, что меня интересует
public abstract class NoCacheBasePage : System.Web.UI.Page
{
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
DisableClientCaching();
}
private void DisableClientCaching()
{
// Do any of these result in META tags e.g. <META HTTP-EQUIV="Expire" CONTENT="-1">
// HTTP Headers or both?
// Does this only work for IE?
Response.Cache.SetCacheability(HttpCacheability.NoCache);
// Is this required for FireFox? Would be good to do this without magic strings.
// Won't it overwrite the previous setting
Response.Headers.Add("Cache-Control", "no-cache, no-store");
// Why is it necessary to explicitly call SetExpires. Presume it is still better than calling
// Response.Headers.Add( directly
Response.Cache.SetExpires(DateTime.UtcNow.AddYears(-1));
}
}
6 ответов
Вот что мы используем в ASP.NET:
// Stop Caching in IE
Response.Cache.SetCacheability(System.Web.HttpCacheability.NoCache);
// Stop Caching in Firefox
Response.Cache.SetNoStore();
Это останавливает кеширование в Firefox и IE, но мы не пробовали другие браузеры. Следующие заголовки ответа добавляются этими утверждениями:
Cache-Control: no-cache, no-store
Pragma: no-cache
Для чего бы это ни стоило, я просто должен был справиться с этим в моем приложении ASP.NET MVC 3. Вот блок кода, который я использовал в файле Global.asax, чтобы обработать это для всех запросов.
protected void Application_BeginRequest()
{
//NOTE: Stopping IE from being a caching whore
HttpContext.Current.Response.Cache.SetAllowResponseInBrowserHistory(false);
HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache);
HttpContext.Current.Response.Cache.SetNoStore();
Response.Cache.SetExpires(DateTime.Now);
Response.Cache.SetValidUntilExpires(true);
}
Я пробовал различные комбинации, и у них не получалось в FireFox. Прошло некоторое время, поэтому ответ выше может работать нормально, или я что-то пропустил.
Что всегда работало для меня, так это добавление следующего к заголовку каждой страницы или шаблону (главная страница в.net).
<script language="javascript" type="text/javascript">
window.onbeforeunload = function () {
// This function does nothing. It won't spawn a confirmation dialog
// But it will ensure that the page is not cached by the browser.
}
</script>
Это отключило все кэширование во всех браузерах для меня в обязательном порядке.
Есть два подхода, о которых я знаю. Первый - сказать браузеру не кэшировать страницу. Настройка Response на отсутствие кэша позаботится об этом, однако, как вы подозреваете, браузер часто игнорирует эту директиву. Другой подход - установить дату и время вашего ответа на точку в будущем. Я полагаю, что все браузеры исправят это к текущему времени, когда они добавят страницу в кеш, но она покажет страницу как более новую, когда будет сделано сравнение. Я считаю, что могут быть случаи, когда сравнение не проводится. Я не уверен в деталях, и они меняются с каждой новой версией браузера. Последнее замечание: мне больше повезло со страницами, которые "обновляются" сами (еще одна директива ответа). Обновление кажется менее вероятным из кеша.
Надеюсь, это поможет.
См. Также Как запретить Google Chrome кэшировать мои входные данные, особенно скрытые при повторном нажатии пользователем? без которого Chrome может перезагрузить, но сохранить предыдущее содержимое <input>
элементы - другими словами, использовать autocomplete="off"
,
Я собираюсь протестировать добавление тега no-store на наш сайт, чтобы увидеть, имеет ли это значение для кэширования в браузере (Chrome иногда кэширует страницы). Я также нашел эту статью очень полезной по документации о том, как и почему работает кэширование, и посмотрим на следующий ETag, если магазин не надежен: