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