Отключение кеширования браузеров для всех браузеров из ASP.NET
Я после окончательной ссылки на то, что код ASP.NET требуется для отключенных браузеров при кешировании страницы. Существует много способов повлиять на заголовки и метатеги HTTP, и я получаю впечатление, что для правильного поведения разных браузеров требуются разные настройки. Было бы здорово получить контрольный бит кода, прокомментированный, чтобы указать, какой из них работает для всех браузеров и который требуется для конкретного браузера, включая версии.
Существует огромная информация об этой проблеме, но мне еще предстоит найти хорошую ссылку, которая описывает преимущества каждого метода и определяет ли какой-то конкретный метод API более высокого уровня.
Меня особенно интересует ASP.NET 3.5 SP1, но было бы неплохо получить ответы и на более раннюю версию.
Эта запись в блоге Две важные отличия между Firefox и кэшированием IE описывают некоторые отличия в поведении протокола 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));
}
}
Ответы
Ответ 1
Это то, что мы используем в 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
Ответ 2
Для чего это стоит, я просто должен был справиться с этим в своем приложении 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);
}
Ответ 3
Я пробовал различные комбинации, и они не срабатывали в 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>
Это отключает все кэширование во всех браузерах для меня.
Ответ 4
Есть два подхода, о которых я знаю. Первое - сообщить браузеру не кэшировать страницу. Установка ответа на кеш не заботится об этом, однако, поскольку вы подозреваете, что браузер часто игнорирует эту директиву. Другой подход заключается в том, чтобы установить дату вашего ответа на точку в будущем. Я считаю, что все браузеры будут исправлять это до текущего времени, когда они добавят страницу в кеш, но при сравнении будет отображаться страница как новая. Я считаю, что могут быть случаи, когда сравнение не производится. Я не уверен в деталях, и они меняются с каждым новым выпуском браузера.
Заключительная записка Мне повезло со страницами, которые "обновляют" себя (другая директива ответа). Обновление кажется менее вероятным из кеша.
Надеюсь, что это поможет.
Ответ 5
Я собираюсь протестировать добавление тега no-store на наш сайт, чтобы узнать, не влияет ли это на кеширование браузера (иногда Chrome кэшировал страницы). Я также нашел эту статью очень полезной в документации о том, как и почему работает кеширование, и посмотрим на ETag, если нет-store не является надежным:
http://www.mnot.net/cache_docs/
http://en.wikipedia.org/wiki/HTTP_ETag
Ответ 6
См. также Как предотвратить google chrome от кеширования моих входов, esp скрытых при повторном нажатии пользователя?, без которого Chrome может перезагружать, но сохранить предыдущий контент <input>
элементы - другими словами, используйте autocomplete="off"
.