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

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 не является надежным:

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

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

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