Отключение кэширования браузера для всех браузеров из ASP.NET - PullRequest
83 голосов
/ 27 мая 2009

Я после окончательной ссылки на то, что 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 ]

95 голосов
/ 28 мая 2009

Это то, что мы используем в 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
38 голосов
/ 14 апреля 2011

Для чего бы это ни стоило, мне просто пришлось справиться с этим в моем приложении 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);
    }
2 голосов
/ 22 ноября 2011

Я пробовал различные комбинации, и у них не получалось в 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>

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

1 голос
/ 27 мая 2009

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

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

0 голосов
/ 05 ноября 2016

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

0 голосов
/ 28 июля 2012

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...