Disabilitazione della memorizzazione nella cache del browser per tutti i browser da ASP.NET


87

Sto cercando un riferimento definitivo a quale codice ASP.NET è necessario per disabilitare i browser dalla memorizzazione nella cache della pagina. Esistono molti modi per influenzare le intestazioni HTTP e i metatag e ho l'impressione che siano necessarie impostazioni diverse per fare in modo che browser diversi si comportino correttamente. Sarebbe davvero fantastico avere un bit di riferimento di codice commentato per indicare quale funziona per tutti i browser e quale è richiesto per browser particolari, comprese le versioni.

C'è un'enorme quantità di informazioni su questo problema, ma devo ancora trovare un buon riferimento che descriva i vantaggi di ciascun metodo e se una particolare tecnica sia stata sostituita da un'API di livello superiore.

Sono particolarmente interessato ad ASP.NET 3.5 SP1, ma sarebbe bene ottenere risposte anche per la versione precedente.

Questo articolo di blog Due importanti differenze tra Firefox e IE Caching descrive alcune differenze di comportamento del protocollo HTTP.

Il codice di esempio seguente illustra il tipo di cose che mi interessa

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
Proverei a rispondere se non sapessi quanto sia orribilmente impossibile il tuo compito. Controllare la cache del cliente è come provare a usare bacchette lunghe 3 metri per riorganizzare i mobili.
Jeff Meatball Yang,

Molte risposte che coprono solo una parte del problema sarebbero comunque molto preziose. Per favore, aggiungi i tuoi 2 centesimi.
Martin Hollingsworth,

Risposte:


96

Questo è ciò che usiamo in ASP.NET:

// Stop Caching in IE
Response.Cache.SetCacheability(System.Web.HttpCacheability.NoCache);

// Stop Caching in Firefox
Response.Cache.SetNoStore();

Smette di memorizzare nella cache in Firefox e IE, ma non abbiamo provato altri browser. Le seguenti intestazioni di risposta vengono aggiunte da queste istruzioni:

Cache-Control: no-cache, no-store
Pragma: no-cache

5
+1 Funziona per me in Chrome, grazie mille. Uso anche Response.Cache.SetAllowResponseInBrowserHistory (true); per evitare la cronologia memorizzare una voce per ogni richiesta della stessa pagina.
daniloquio

12
Apparentemente qualcuno ha scoperto che l'utilizzo di SetCacheability con NoCache disabilita anche la cache di output di ASP.NET (cache lato server). Suggeriscono di utilizzare invece l'opzione ServerAndNoCache. codeclimber.net.nz/archive/2007/04/01/…
md1337

1
Per chiarire i commenti nello snippet di codice, il metodo principale è SetCacheability . SetNoStoreè una soluzione alternativa a IE6. Vedi Perché sia ​​no-cache che no-store dovrebbero essere usati nella risposta HTTP? .
Edward Brey

3
FWIW ... Necessario per aggiungere SetNoStore per IE10
felickz

Per coloro che leggono questa pagina che emetteranno PDF dinamici su https e imposteranno le intestazioni della cache in questo modo, fare attenzione al seguente bug di IE8 e inferiore: stackoverflow.com/questions/1038707/…
Paddy

41

Per quel che vale, dovevo solo gestirlo nella mia applicazione ASP.NET MVC 3. Ecco il blocco di codice che ho usato nel file Global.asax per gestirlo per tutte le richieste.

    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);
    }

L' HttpContext.Current.Response.Cache.SetAllowResponseInBrowserHistory(false)ha fatto la differenza per evitare la memorizzazione nella cache in bith IE e Firefox
Michael Kniskern

2
-1, l'impostazione in questi Application_BeginRequest () fa sì che le intestazioni senza cache vengano inviate per gli elementi che probabilmente vorrai memorizzare nella cache (file JavaScript, immagini, ecc.). Non l'ho ancora provato, ma la posizione dell'OP (impostando le intestazioni nella pagina ASP stessa) è probabilmente migliore.
Evan Haas

Mi aspettavo che questa risposta funzionasse in quanto è il modo più accurato per impostarla in glabal.asax ma ancora nessuna gioia
lawphotog

5
@Evan, Application_BeginRequest verrà chiamato solo per le richieste inviate da IIS ad ASP.NET. Molte volte, i file statici come CSS, JS, immagini, caratteri e così via sono estensioni considerate file statici da IIS e non inviati a ASP.NET Runtime. Se IIS è impostato per inviare tutte le richieste al runtime ASP.NET, sì, ciò si applicherebbe a tutte le richieste, anche se i file sono statici e devono essere memorizzati nella cache.
Adam Carr

@Adam, ha senso. Vorrei annullare il mio -1 ma SO dice che il mio voto è bloccato in :-(
Evan Haas

2

Ho provato varie combinazioni e non sono riuscite in FireFox. È passato un po 'di tempo quindi la risposta sopra potrebbe funzionare bene o potrei essermi perso qualcosa.

Quello che ha sempre funzionato per me è aggiungere quanto segue all'inizio di ogni pagina, o il modello (Pagina master in .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>

Questo ha disabilitato tutte le cache in tutti i browser per me senza fallo.


7
Non sono sicuro di cosa dovrebbe fare, ma sembra un grosso trucco grasso che è destinato a fallire nel prossimo aggiornamento di uno qualsiasi di questi browser.
md1337

È spiegato ad esempio su web.archive.org/web/20160112095216/http://www.hunlock.com/blogs/… - in sintesi l'evento onbeforeunload è stato implementato per essere utilizzato dalle banche e impedisce che la pagina venga memorizzata nella cache.
ChrisW

1

Ci sono due approcci che conosco. Il primo è dire al browser di non memorizzare la pagina nella cache. L'impostazione della risposta su nessuna cache si prende cura di questo, tuttavia poiché si sospetta che il browser spesso ignorerà questa direttiva. L'altro approccio consiste nell'impostare la data e l'ora della risposta su un punto futuro. Credo che tutti i browser lo correggeranno all'ora corrente quando aggiungono la pagina alla cache, ma mostrerà la pagina come più recente quando viene effettuato il confronto. Credo che in alcuni casi non venga effettuato un confronto. Non sono sicuro dei dettagli e cambiano con ogni nuova versione del browser. Nota finale Ho avuto più fortuna con le pagine che si "aggiornano" da sole (un'altra direttiva di risposta). È meno probabile che l'aggiornamento provenga dalla cache.

Spero che aiuti.


0

Proverò ad aggiungere il tag no-store al nostro sito per vedere se questo fa la differenza per la memorizzazione nella cache del browser (Chrome a volte ha memorizzato nella cache le pagine). Ho anche trovato questo articolo molto utile sulla documentazione su come e perché il caching funziona e guarderò ETag's next se il no-store non è affidabile:

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

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


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.