Deaktivieren des Browser-Caching für alle Browser in ASP.NET

86

Ich bin nach einem endgültigen Verweis darauf, welcher ASP.NET-Code erforderlich ist, damit Browser die Seite nicht zwischenspeichern können. Es gibt viele Möglichkeiten, die HTTP-Header und Meta-Tags zu beeinflussen, und ich habe den Eindruck, dass unterschiedliche Einstellungen erforderlich sind, damit sich verschiedene Browser korrekt verhalten. Es wäre wirklich großartig, wenn ein Referenzcode-Code kommentiert würde, um anzugeben, welcher für alle Browser funktioniert und welcher für einen bestimmten Browser, einschließlich Versionen, erforderlich ist.

Es gibt dort eine große Menge an Informationen zu diesem Problem, aber ich habe noch keine gute Referenz gefunden, die die Vorteile jeder Methode beschreibt und ob eine bestimmte Technik durch eine übergeordnete API ersetzt wurde.

Ich interessiere mich besonders für ASP.NET 3.5 SP1, aber es wäre gut, auch Antworten für frühere Versionen zu erhalten.

Dieser Blogeintrag Zwei wichtige Unterschiede zwischen Firefox und IE Caching beschreibt einige Unterschiede im Verhalten des HTTP-Protokolls.

Der folgende Beispielcode zeigt, woran ich interessiert bin

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));
    }
}
Martin Hollingsworth
quelle
5
Ich würde versuchen zu antworten, wenn ich nicht wüsste, wie schrecklich unmöglich deine Aufgabe ist. Das Steuern des Cache des Kunden ist wie der Versuch, 10 Fuß lange Essstäbchen zu verwenden, um Möbel neu anzuordnen.
Jeff Meatball Yang
Eine ganze Reihe von Antworten, die nur einen Teil des Problems abdecken, wären immer noch sehr wertvoll. Bitte werfen Sie Ihre 2 Cent wert.
Martin Hollingsworth

Antworten:

96

Folgendes verwenden wir in ASP.NET:

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

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

In Firefox und IE wird das Caching gestoppt, aber wir haben keine anderen Browser ausprobiert. Die folgenden Antwortheader werden durch diese Anweisungen hinzugefügt:

Cache-Control: no-cache, no-store
Pragma: no-cache
HttpWatchSupport
quelle
5
+1 Das funktioniert bei mir in Chrome, vielen Dank. Ich benutze auch Response.Cache.SetAllowResponseInBrowserHistory (true); Um den Verlauf zu vermeiden, muss ein Eintrag für jede Anforderung derselben Seite gespeichert werden.
Daniloquio
12
Anscheinend hat jemand entdeckt, dass die Verwendung von SetCacheability mit NoCache auch den ASP.NET-Ausgabecache (serverseitigen Cache) deaktiviert. Sie schlagen vor, stattdessen die Option ServerAndNoCache zu verwenden. codeclimber.net.nz/archive/2007/04/01/…
md1337
1
Die Hauptmethode ist, um die Kommentare im Code-Snippet zu verdeutlichen SetCacheability. SetNoStoreist eine IE6-Problemumgehung. Siehe Warum sollten in der HTTP-Antwort sowohl No-Cache als auch No-Store verwendet werden? .
Edward Brey
3
FWIW ... Muss SetNoStore für IE10 hinzufügen
felickz
Für diejenigen, die diese Seite lesen und dynamische PDFs über https ausgeben und die Cache-Header wie folgt einstellen, beachten
Paddy
40

Für das, was es wert ist, musste ich dies nur in meiner ASP.NET MVC 3-Anwendung behandeln. Hier ist der Codeblock, den ich in der Datei Global.asax verwendet habe, um dies für alle Anforderungen zu behandeln.

    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);
    }
Adam Carr
quelle
Das HttpContext.Current.Response.Cache.SetAllowResponseInBrowserHistory(false)machte den Unterschied, um das Caching in IE und FireFox zu verhindern
Michael Kniskern
2
Wenn Sie -1 in diesen Application_BeginRequest () festlegen, werden die No-Cache-Header für Elemente gesendet, die wahrscheinlich zwischengespeichert werden sollen (JavaScript-Dateien, Bilder usw.). Ich habe es noch nicht ausprobiert, aber der Speicherort des OP (Festlegen der Header auf der ASP-Seite selbst) ist wahrscheinlich besser.
Evan Haas
Ich hatte erwartet, dass diese Antwort funktioniert, da es die beste Möglichkeit ist, sie in glabal.asax zu setzen, aber noch keine Freude
lawphotog
5
@Evan, Application_BeginRequest wird nur für Anforderungen aufgerufen, die von IIS an ASP.NET gesendet werden. Oft sind statische Dateien wie CSS, JS, Bilder, Schriftarten usw. Erweiterungen, die als statische Dateien von IIS betrachtet und nicht an ASP.NET Runtime gesendet werden. Wenn IIS so eingerichtet ist, dass alle Anforderungen an die ASP.NET-Laufzeit gesendet werden, gilt dies für alle Anforderungen, auch wenn die Dateien statisch sind und zwischengespeichert werden sollten.
Adam Carr
@Adam, macht Sinn. Ich würde meine -1 rückgängig machen, aber SO sagt, dass meine Stimme gesperrt ist in :-(
Evan Haas
2

Ich habe verschiedene Kombinationen ausprobiert und sie in FireFox fehlschlagen lassen. Es ist eine Weile her, daher funktioniert die obige Antwort möglicherweise gut oder ich habe etwas verpasst.

Was für mich immer funktioniert hat, ist, dem Kopf jeder Seite oder der Vorlage (Masterseite in .net) Folgendes hinzuzufügen.

<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>

Dies hat das Caching in allen Browsern für mich ohne Fehler deaktiviert.

Steve
quelle
7
Ich bin mir nicht sicher, was dies tun soll, aber es sieht aus wie ein großer, fetter Hack, der beim nächsten Update eines dieser Browser scheitern wird.
Md1337
Dies wird beispielsweise unter web.archive.org/web/20160112095216/http://www.hunlock.com/blogs/… erläutert. Zusammenfassend wurde das Ereignis onbeforeunload implementiert, um von Banken verwendet zu werden, und verhindert, dass die Seite zwischengespeichert wird.
ChrisW
1

Ich kenne zwei Ansätze. Der erste besteht darin, den Browser anzuweisen, die Seite nicht zwischenzuspeichern. Wenn Sie die Antwort auf keinen Cache setzen, wird dies erledigt. Wie Sie jedoch vermuten, ignoriert der Browser diese Anweisung häufig. Der andere Ansatz besteht darin, das Datum und die Uhrzeit Ihrer Antwort auf einen zukünftigen Punkt festzulegen. Ich glaube, dass alle Browser dies auf die aktuelle Zeit korrigieren, wenn sie die Seite zum Cache hinzufügen, aber es wird die Seite als neuer anzeigen, wenn der Vergleich durchgeführt wird. Ich glaube, es kann Fälle geben, in denen kein Vergleich durchgeführt wird. Ich bin mir der Details nicht sicher und sie ändern sich mit jeder neuen Browserversion. Schlussbemerkung Ich hatte besseres Glück mit Seiten, die sich selbst "aktualisieren" (eine weitere Antwortanweisung). Die Aktualisierung scheint weniger wahrscheinlich aus dem Cache zu kommen.

Hoffentlich hilft das.

Pat O.
quelle
0

Ich werde das Hinzufügen des No-Store-Tags zu unserer Website testen, um festzustellen, ob dies einen Unterschied zum Browser-Caching darstellt (Chrome hat die Seiten manchmal zwischengespeichert). Ich fand diesen Artikel auch sehr nützlich in der Dokumentation darüber, wie und warum das Caching funktioniert, und werde als nächstes auf ETags schauen, wenn der No-Store nicht zuverlässig ist:

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

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

Der Codierer
quelle