wake-up-neo.net

Deaktivieren der Browser-Zwischenspeicherung für alle Browser von ASP.NET

Nach einem definitiven Verweis darauf, welcher ASP.NET-Code zum Deaktivieren von Browsern beim Zwischenspeichern der Seite erforderlich ist. Es gibt viele Möglichkeiten, die HTTP-Header und -Meta-Tags zu beeinflussen, und ich habe den Eindruck, dass verschiedene Einstellungen erforderlich sind, damit sich verschiedene Browser korrekt verhalten. Es wäre wirklich großartig, ein Referenzbit Code kommentiert zu bekommen, um anzuzeigen, welche Funktion für alle Browser gilt und welche für bestimmte Browser einschließlich Versionen erforderlich ist.

Es gibt eine riesige Menge an Informationen zu diesem Problem, aber ich muss noch eine gute Referenz finden, in der die Vorteile jeder Methode beschrieben werden 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 veranschaulicht die Dinge, die mich interessieren

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

Das ist, was wir in ASP.NET verwenden:

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

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

Das Zwischenspeichern in Firefox und IE wird beendet, andere Browser haben wir jedoch nicht ausprobiert. Die folgenden Antwortheader werden von diesen Anweisungen hinzugefügt:

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

Für das, was es wert ist, musste ich nur in meiner ASP.NET MVC 3-Anwendung damit umgehen. 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);
    }
38
Adam Carr

Ich habe verschiedene Kombinationen ausprobiert und habe sie in Firefox versagen lassen. Es ist eine Weile her, dass die obige Antwort gut funktioniert oder ich etwas übersehen habe.

Was immer für mich 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 unbedingt deaktiviert.

2
Steve

Ich kenne zwei Ansätze. Der erste ist, dem Browser mitzuteilen, dass die Seite nicht im Cache gespeichert werden soll. Das Festlegen der Antwort auf "Kein Cache" sorgt dafür, dass der Browser diese Anweisung jedoch häufig ignoriert, wenn Sie den Verdacht haben, dass dies nicht der Fall ist. Der andere Ansatz besteht darin, die Datumszeit Ihrer Antwort auf einen Punkt in der Zukunft festzulegen. Ich glaube, dass alle Browser dies auf den aktuellen Zeitpunkt korrigieren, wenn sie die Seite zum Cache hinzufügen, aber die Seite wird neu angezeigt, wenn der Vergleich durchgeführt wird. Ich glaube, es kann Fälle geben, in denen kein Vergleich gemacht wird. Ich bin mir nicht sicher über die Details und sie ändern sich mit jedem neuen Browser-Release .. _ Schlussbemerkung Ich hatte mehr Glück mit Seiten, die sich "aktualisieren" (eine andere Antwortanweisung). Die Aktualisierung scheint weniger wahrscheinlich aus dem Cache zu stammen. 

Hoffentlich hilft das.

1
Pat O

Siehe auch Wie kann ich verhindern, dass Google Chrome meine Eingaben zwischenspeichert, vor allem versteckte, wenn der Benutzer auf "Zurück" klickt? ohne die Chrome möglicherweise den vorherigen Inhalt der <input>-Elemente erneut lädt, aber verwendet, dh autocomplete="off".

0
ChrisW

Ich werde das Hinzufügen des No-Store-Tags zu unserer Website testen, um zu sehen, ob dies einen Unterschied beim Browser-Caching darstellt (Chrome hat die Seiten manchmal im Cache gespeichert). Ich fand diesen Artikel auch sehr nützlich in der Dokumentation, wie und warum das Caching funktioniert, und werde ETAGs nächsten betrachten, wenn der No-Store nicht zuverlässig ist:

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

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

0
The Coder