Arhn - архитектура программирования

Отключение кеширования браузера для всех браузеров из 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));
    }
}

  • Я бы попытался ответить, если бы не знал, насколько ужасно невыполнима твоя задача. Управление тайником клиента похоже на попытку использовать палочки для еды длиной 10 футов, чтобы переставить мебель. 27.05.2009
  • Множество ответов, охватывающих только часть проблемы, по-прежнему будут очень ценными. Пожалуйста, добавьте свои 2 цента. 27.05.2009

Ответы:


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
27.05.2009
  • +1 У меня это работает в Chrome, большое спасибо. Я также использую Response.Cache.SetAllowResponseInBrowserHistory (true); чтобы избежать истории, чтобы сохранить запись для каждого запроса одной и той же страницы. 06.03.2012
  • По-видимому, кто-то обнаружил, что использование SetCacheability с NoCache также отключает кеш вывода ASP.NET (кеш на стороне сервера). Вместо этого они предлагают использовать параметр ServerAndNoCache. codeclimber.net.nz/ архив / 2007/04/01 / 08.03.2012
  • Чтобы прояснить комментарии во фрагменте кода, основным методом является SetCacheability. SetNoStore - это обходной путь IE6. См. Почему в ответе HTTP следует использовать и без кеширования, и без хранения?. 28.03.2013
  • FWIW ... Необходимо добавить SetNoStore для IE10 10.05.2013
  • Для тех, кто читает эту страницу, кто будет выводить динамические PDF-файлы через https и устанавливать подобные заголовки кеша, обратите внимание на следующую ошибку IE8 и ниже: stackoverflow.com/questions/1038707/ 17.09.2014
  • Абсолютно правильный вопрос по этой теме! Я перепробовал все, установщики действий onExecuting и onExecuted со всеми видами комбинаций, и ничего не работает. Но добавление этого в мою модель рендеринга сработало как шарм! 24.11.2020

  • 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);
        }
    
    14.04.2011
  • HttpContext.Current.Response.Cache.SetAllowResponseInBrowserHistory(false) имеет значение для предотвращения кеширования в IE и FireFox. 08.06.2011
  • -1, установка в этих Application_BeginRequest () вызывает отправку заголовков без кеширования для элементов, которые вы, вероятно, захотите кэшировать (файлы JavaScript, изображения и т. Д.). Я еще не пробовал, но расположение OP (установка заголовков на самой странице ASP), вероятно, лучше. 05.08.2013
  • Я ожидал, что этот ответ сработает, так как это лучший способ установить его в glabal.asax, но пока нет радости 06.08.2013
  • @Evan, Application_BeginRequest будет вызываться только для запросов, отправленных из IIS в ASP.NET. Часто статические файлы, такие как CSS, JS, изображения, шрифты и т. Д., Являются расширениями, которые считаются статическими файлами из IIS и не отправляются в среду выполнения ASP.NET. Если IIS настроен для отправки всех запросов в среду выполнения ASP.NET, тогда да, это будет применяться ко всем запросам, даже если файлы статические и должны быть кэшированы. 08.12.2013
  • @ Адам, это имеет смысл. Я бы отменил свой -1, но ТАК говорит, что мой голос заблокирован :-( 11.12.2013
  • Хорошо, тут придирка ... На объект HttpResponse ссылаются двумя разными способами: 1) HttpContext.Current.Response и 2) Response. Вероятно, было бы чище выбрать одно или другое. 23.04.2014
  • Я обнаружил, что применение глобального фильтра действий является более модульным. Кроме того, вы можете приспособиться к ситуациям, когда MVC обслуживает статические файлы (например, связанные скрипты и стили). stackoverflow.com/a/23682242/120955 15.05.2014
  • StriplingWarrior прав, этот метод, похоже, также влияет на бандлы (что не то, чего хотелось бы большинству людей). В локальной среде это также повлияет на статические файлы, как сказал Эван Хаас, но на удаленном сервере IIS будет обрабатывать их (если вы по какой-то причине не установите его по-другому). Я исправил быстрое и грязное решение этой проблемы здесь, stackoverflow.com/a/23695387/2123652 16.05.2014

  • 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>
    

    Это в обязательном порядке отключило для меня кеширование во всех браузерах.

    22.11.2011
  • Не уверен, что это должно делать, но похоже, что это большой жирный хакер, который обязательно потерпит неудачу в следующем обновлении любого из этих браузеров. 08.03.2012
  • Это объясняется, например, https://web.archive.org/web/20160112095216/http://www.hunlock.com/blogs/Mastering_The_Back_Button_With_Javascript - вкратце, событие onbeforeunload было реализовано для использования банками и предотвращает кэширование страницы. 05.11.2016

  • 4

    Я знаю два подхода. Первый - указать браузеру не кэшировать страницу. Об этом позаботится установка ответа на отсутствие кеша, однако, как вы подозреваете, браузер часто игнорирует эту директиву. Другой подход - установить дату и время вашего ответа на определенный момент в будущем. Я считаю, что все браузеры исправят это до текущего времени, когда добавят страницу в кеш, но при сравнении будет отображаться страница как более новая. Я считаю, что в некоторых случаях сравнение не проводится. Я не уверен в деталях, и они меняются с каждой новой версией браузера. Последнее замечание. Мне больше повезло со страницами, которые «обновляются» (еще одна директива ответа). Кажется, что обновление из кеша с меньшей вероятностью.

    Надеюсь, это поможет.

    27.05.2009

    5

    Я собираюсь протестировать добавление тега no-store на наш сайт, чтобы увидеть, влияет ли это на кеширование браузера (Chrome иногда кэшировал страницы). Я также нашел эту статью очень полезной в документации о том, как и почему работает кеширование, и я посмотрю на ETag, если метод no-store ненадежен:

    http://www.mnot.net/cache_docs/

    http://en.wikipedia.org/wiki/HTTP_ETag

    28.07.2012

    6

    См. Также Как запретить Google Chrome кэшировать мои входные данные, особенно скрытые, когда пользователь нажимает кнопку "Назад"?, без чего Chrome может перезагрузиться, но сохранить предыдущее содержимое <input> элементов - другими словами, использовать autocomplete="off".

    05.11.2016
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..