Вимкнення кешування браузера для всіх браузерів з ASP.NET


87

Я шукаю остаточне посилання на те, який код 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));
    }
}

5
Я спробував би відповісти, якби не знав, наскільки жахливо неможливим є твоє завдання. Управління кешем клієнта - це все одно, що намагатися використати палички довжиною 10 футів для перестановки меблів.
Jeff Meatball Yang

Багато відповідей, які охоплюють лише частину проблеми, все одно були б дуже цінними. Будь ласка, викиньте свої 2 центи.
Мартін Холлінгсворт,

Відповіді:


96

Це те, що ми використовуємо в 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

5
+1 Це працює у мене в Chrome, дякую. Я також використовую Response.Cache.SetAllowResponseInBrowserHistory (true); щоб уникнути історії зберігати запис для кожного запиту тієї самої сторінки.
daniloquio

12
Очевидно, хтось виявив, що використання SetCacheability з NoCache також відключає вихідний кеш ASP.NET (кеш на стороні сервера). Вони пропонують замість цього використовувати опцію ServerAndNoCache. codeclimber.net.nz/archive/2007/04/01/…
md1337 07.03.12

1
Для уточнення коментарів у фрагменті коду основним методом є SetCacheability. SetNoStoreє обхідним шляхом IE6. Див. Чому у відповіді HTTP слід використовувати як no-cache, так і no-store? .
Едвард Брей,

3
FWIW ... Потрібно додати SetNoStore для
IE10

Для тих, хто читає цю сторінку, хто буде виводити динамічні PDF-файли через https та встановлювати заголовки кешу таким чином, будь ласка, остерігайтеся наступної IE8 та нижчої помилки: stackoverflow.com/questions/1038707/…
Педді

41

Для того, що це варто, мені просто довелося впоратися з цим у моїй програмі 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);
    }

Це HttpContext.Current.Response.Cache.SetAllowResponseInBrowserHistory(false)мало значення для запобігання кешуванню в bith IE та FireFox
Michael Kniskern

2
-1, установка в цих Application_BeginRequest () призводить до надсилання заголовків без кешу для елементів, які ви, мабуть, хочете кешувати (файли JavaScript, зображення тощо). Я ще не пробував, але розташування OP (встановлення заголовків на самій сторінці ASP), мабуть, краще.
Еван Хаас,

Я очікував, що ця відповідь спрацює, оскільки це найоптимальніший спосіб встановити її у glabal.asax, але поки що ніякої радості
lawphotog

5
@Evan, Application_BeginRequest буде викликатися лише для запитів, які надсилаються з IIS на ASP.NET. Багато разів статичні файли, такі як CSS, JS, зображення, шрифти тощо, є розширеннями, які вважаються статичними файлами з IIS і не надсилаються до середовища виконання ASP.NET. Якщо службу IIS налаштовано на відправлення всіх запитів до середовища виконання ASP.NET, тоді так, це стосуватиметься всіх запитів, навіть якщо файли статичні і повинні бути кешовані.
Адам Карр

@ Адаме, має сенс. Я б скасував свій -1, але ТАК каже, що мій голос заблокований :-(
Еван Хаас,

2

Я пробував різні комбінації, і в 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>

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


7
Не впевнений, що це повинно робити, але це виглядає як великий жирний хак, який обов’язково зазнає невдачі під час наступного оновлення будь-якого з цих браузерів.
md1337

Це пояснюється, наприклад, на web.archive.org/web/20160112095216/http://www.hunlock.com/blogs/… - в підсумку подія onbeforeunload була застосована для використання банками та перешкоджає кешуванню сторінки.
ChrisW

1

Я знаю два підходи. Перший - сказати браузеру не кешувати сторінку. Налаштування Response для no cache подбає про це, однак, як ви підозрюєте, браузер часто ігнорує цю директиву. Інший підхід полягає в тому, щоб встановити дату та час вашої відповіді до точки в майбутньому. Я вважаю, що всі браузери виправлять це на поточний час, коли додають сторінку в кеш, але при порівнянні сторінка відображатиметься як новіша. Я вважаю, що можуть бути випадки, коли порівняння не проводилось. Я не впевнений у деталях, і вони змінюються з кожним новим випуском браузера. Заключна примітка Мені пощастило зі сторінками, які "оновлюються" (ще одна директива щодо відповідей). Оновлення, здається, рідше надходить із кешу.

Сподіваюся, що це допомагає.


0

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

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

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


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.