2009-07-21 12 views
5

Ich versuche, den ASP.NET OutputCache-Mechanismus zu verstehen.
Ich habe eine Testseite mit einem Label und LinkButton erstellt.
Der Beschriftungstext auf jedem Pageload auf dem Server mit dem aktuellen Server-Datum initialisiert wird:ASP.NET OutputCache und Postbacks

protected void Page_Load(object sender, EventArgs e) 
{ 
    lblDate.Text = DateTime.Now.ToString(); 
} 

ich diese Richtlinie verwendet: <%@ OutputCache Duration="600" VaryByParam="none"%>

Wenn ich den Linkbutton drücke das erste Mal bekomme ich einen neuen Text im Etikett, aber wenn ich den Linkbutton erneut drücke, erhalte ich keinen neuen Text.

Ich nehme an, dies ist wegen der Parameter, die auf den Server übertragen werden, die für jeden Postback identisch sind.

Gibt es eine Möglichkeit, mit OutputCach und Postback-Steuerelementen zu arbeiten?

Antwort

6

Richtig, das Ding ist, dass Sie durch NO-Parameter sind variiert, um die Antwort html erste Anforderung zwischengespeichert wird und serviert für die nächsten 10 Minuten (in der Theorie). Wenn Sie GETs zwischenspeichern, aber verschiedene POSTs verarbeiten möchten, sollten Sie nach Ihren POST-Parametern variieren.

Lassen Sie mich Ihnen ein Beispiel geben. Sie haben eine Texteingabe, die zum Senden einer E-Mail mit dem Inhalt des POST verwendet wird. Wenn Sie nach dem eingegebenen Namen variieren, würde jede Anfrage innerhalb der Caching-Zeitspanne mit unterschiedlichen Werten für diese Texteingabe Ihren Handler erreichen und den Versand der E-Mail verarbeiten.

Auf der anderen Seite könnten Sie um * variieren, aber dann würden Sie das Kernel-Modus-Caching verlieren.

+0

Kannst du ein Beispiel heiß, meine post-Parameter als VaryByParam verwenden? – lnetanel

+0

sicher, <% @ OutputCache Duration = "600" VaryByParam = "YourPostParam1, YourPostParam2, (auch alle GET-Parameter), ..."%> – user134706

+0

Ich habe das herausgefunden, bevor wir diesen Post gefunden haben - wir hatten tatsächlich ein Problem damit ein Live-Rollout, weil wir VaryByParam auf "none" gesetzt hatten, wo Seiten auf sich selbst zurückschicken! –

2

Sie sind richtig in Ihre Annahmen.

Ihre OutputCache-Direktive weist den Ausgabe-Caching-Mechanismus an, die gesamte Seite für eine bestimmte URL für 600 Sekunden zwischenzuspeichern.

In Ihrem einfachen Beispiel verwenden Sie wahrscheinlich keine Abfragezeichenfolgen. Mit der VaryByParam-Deklaration innerhalb der Direktive können Sie jedoch einen Abfragezeichenfolgenparameter angeben, der sicherstellt, dass jeder unterschiedliche Wert dieses Parameters separat zwischengespeichert wird. Zum Beispiel, wenn Sie hat:

<%@ OutputCache Duration="600" VaryByParam="ProductID"%> 

dann diese drei verschiedenen URLs würden jeweils einzeln zwischengespeichert werden, und den Wert der „ProductID“ Parameter, um etwas zu ändern noch nicht im Cache gespeichert würde sicherstellen, dass die Seite verarbeitet und wiedergegeben durch richtig die ASP.NET-Laufzeit:

http://www.example.com/viewproduct.aspx?ProductID=123 
http://www.example.com/viewproduct.aspx?ProductID=3 
http://www.example.com/viewproduct.aspx?ProductID=67 

in Ihrem Beispiel auf Ihrer Schaltfläche klicken, wird die Seite bereits vorher gemacht worden (und cached) und wenn Sie wieder Post gibt es keinen Unterschied in der URL, die Sie Zurückspeichern und effektiv neu laden, daher zeigt die ASP.NET-Laufzeit die zwischengespeicherte Seite an, ohne sie zu durchlaufen e Prozess des erneuten Renderns.

Anders als durch Ändern des Werts eines "VaryByParam" -Parameters ist die OutputCache-Direktive ein ziemlich "Alles-oder-Nichts" -Ansatz zum Seitencachen. Es gibt ein "VaryByContol" -Attribut für die Direktive, das jedoch nur in ASP.NET-Benutzersteuerelementen verwendet werden kann, sondern eine vollständige ASP.NET-Webseite.

Von Ihrer Frage, es klingt eher wie Sie teilweise Seite Caching untersuchen müssen. Entweder das oder ein Mechanismus zum Ungültigmachen des Caches, wenn ein Ereignis eintritt. Dies geschieht normalerweise durch Hinzufügen einer "Cache-Abhängigkeit".

Dafür sollten die folgenden Links helfen:

Caching Portions of an ASP.NET Page
Tip/Trick: Implement "Donut Caching" with the ASP.NET 2.0 Output Cache Substitution Feature
Programmatically Removing a Page from the OutputCache

Verwandte Themen