Отключение кэширования браузера для всех браузеров из 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));
}
}
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. Вот блок кода, который я использовал в глобальном.файл 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>
это отключило все кэширование во всех браузерах для меня в обязательном порядке.
есть два подхода, которые я знаю. Во-первых, чтобы сказать браузеру не кэшировать страницу. Установка ответа на no cache заботится об этом, однако, как вы подозреваете, браузер часто игнорирует эту директиву. Другой подход заключается в том, чтобы установить дату и время вашего ответа на точку в будущем. Я считаю, что все браузеры исправят это до текущего времени, когда они добавят страницу в кэш, но при сравнении она будет отображаться как более новая. Я верю, что есть могут быть некоторые случаи, когда сравнение не производится. Я не уверен в деталях, и они меняются с каждым новым выпуском браузера. Последнее замечание мне повезло с страницами, которые" обновляют " себя (другая директива ответа). Обновление кажется менее вероятным из кэша.
надеюсь, что это поможет.
Я собираюсь проверить добавление тега no-store на наш сайт, чтобы увидеть, имеет ли это значение для кэширования браузера (Chrome иногда кэширует страницы). Я также нашел эту статью очень полезной в документации о том, как и почему работает кэширование, и будет смотреть на следующий ETag, если no-store не является надежным:
см. также как предотвратить Google chrome от кэширования моих входов, особенно скрытых, когда пользователь нажимает кнопку Назад? без которого Chrome может перезагрузиться, но сохранить предыдущее содержимое
<input>
элементы-другими словами, использоватьautocomplete="off"
.