2009-05-27 12 views
78

Ich bin nach einer definitiven Referenz zu dem, was ASP.NET-Code erforderlich ist, um Browser vom Zwischenspeichern der Seite deaktiviert. 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 toll, ein Referenz-Code-Bit zu bekommen, das kommentiert wird, um anzuzeigen, welches für alle Browser funktioniert und welches für bestimmte Browser, einschließlich Versionen, benötigt wird.Deaktivieren des Browser-Caching für alle Browser von ASP.NET

Es gibt eine riesige Menge an Informationen zu diesem Thema, aber ich muss noch eine gute Referenz finden, die die Vorteile jeder Methode beschreibt und ob eine bestimmte Technik durch eine API höherer Ebene ersetzt wurde.

Ich bin besonders an ASP.NET 3.5 SP1 interessiert, aber es wäre gut, Antworten für frühere Version zu erhalten.

Dieser Blog-Eintrag Two Important Differences between Firefox and IE Caching beschreibt einige HTTP-Protokoll Verhaltensunterschiede.

Der folgende Beispielcode veranschaulicht die Art von Sache, die ich in

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

Ich würde versuchen zu antworten, wenn ich nicht wüsste, wie schrecklich unmöglich deine Aufgabe ist. Die Kontrolle über den Cache des Clients ist so, als würde man versuchen, 10 Fuß lange Essstäbchen zu verwenden, um Möbel neu anzuordnen. –

+0

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

Antwort

91

Dies 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(); 

Es stoppt Caching in Firefox und IE, aber wir haben nicht anderen Browser versucht. Die folgenden Antwort-Header werden von diesen Aussagen hinzugefügt:

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

+1 .. Vielen Dank für Ihren Vorschlag –

+5

+1 Dies funktioniert für mich in Chrome, vielen Dank. Ich benutze auch Response.Cache.SetAllowResponseInBrowserHistory (true); um zu vermeiden, dass ein Eintrag für jede Anfrage derselben Seite gespeichert wird. – 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. http://codeclimber.net.nz/archive/2007/04/01/Beware-the-ASP.NET-SetCacheability-method.aspx – md1337

1

interessiert bin Es gibt zwei Ansätze, die ich kenne. Die erste besteht darin, dem Browser mitzuteilen, dass die Seite nicht zwischengespeichert werden soll. Wenn Sie die Antwort auf keinen Cache festlegen, wird dies jedoch berücksichtigt, da Sie vermuten, dass der Browser diese Anweisung häufig ignoriert. Der andere Ansatz besteht darin, die Datumszeit Ihrer Antwort auf einen Punkt in der Zukunft festzulegen. Ich glaube, dass alle Browser dies auf die aktuelle Zeit korrigieren, wenn sie die Seite dem Cache hinzufügen, aber es wird die Seite als neuere anzeigen, wenn der Vergleich gemacht wird. Ich glaube, dass es Fälle geben kann, in denen ein Vergleich nicht gemacht wird. Ich bin mir der Details nicht sicher und sie ändern sich mit jeder neuen Browserversion. Schlussbemerkung Ich hatte mehr Glück mit Seiten, die sich selbst "auffrischen" (eine weitere Antwortanweisung). Die Aktualisierung scheint weniger wahrscheinlich aus dem Cache zu stammen.

Hoffe, dass hilft.

37

Für das, was es wert ist, ich dies nur mußte in meiner ASP.NET MVC 3-Anwendung behandeln. Hier ist der Codeblock, den ich in der Datei Global.asax verwendet habe, um das für alle Anfragen 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); 
    } 
+0

Die 'HttpContext.Current.Response.Cache.SetAllowResponseInBrowserHistory (false)' machte den Unterschied, um das Zwischenspeichern zu verhindern bith IE und FireFox –

+0

diese Antwort funktionierte nicht für mich –

+2

-1, Einstellung in diesen Application_BeginRequest() bewirkt, dass die No-Cache-Header für Elemente gesendet werden, die Sie wahrscheinlich im Cache (JavaScript-Dateien, Bilder usw.) möchten. Ich habe es noch nicht ausprobiert, aber die OP-Position (die Header in der ASP-Seite selbst einstellen) ist wahrscheinlich besser. –

2

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

Was für mich immer funktioniert hat, ist das Hinzufügen der folgenden zum Kopf jeder Seite oder der Vorlage (Masterseite 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> 

Das hat alle Caching in allen Browsern für mich ohne Fehler deaktiviert.

+7

Nicht sicher was dies tun soll, aber es sieht wie ein großer fetter Hack aus, der im nächsten Update eines dieser Browsers fehlschlagen wird. – md1337

+0

Es wird z.B. https://web.archive.org/web/20160112095216/http://www.hunlock.com/blogs/Mastering_The_Back_Button_With_Javascript - Zusammenfassend wurde das onbeforeunload-Ereignis für die Verwendung durch Banken implementiert und verhindert, dass die Seite zwischengespeichert wird. – ChrisW

0

Ich werde das Hinzufügen des No-Store-Tags zu unserer Website testen, um festzustellen, ob dies für das Browser-Caching von Bedeutung ist (Chrome hat die Seiten manchmal zwischengespeichert).Ich fand auch dieser Artikel sehr nützlich für die Dokumentation darüber, wie und warum das Caching funktioniert und wird als nächstes, wenn der no-store nicht zuverlässig bei ETag des suchen ist:

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

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

Verwandte Themen