Das zwischenspeichern von Daten wurde schon vor einiger Zeit entdeckt um die Performance von Anwendungen zu verbessern. Seit Speicher billig geworden ist, wird diese Technik häufig eingesetzt.
Beim planen von Software ist das einbeziehen von Chaching in modernen Lösungen unumgänglich. Als erstes denkt man bei Web Anwendungen immer an den Browser Cache. Es ist natürlich schneller die Seiten erst gar nicht vom Webserver zu holen. Ein weiterer erheblicher Performance Zuwachs erhält man, wenn die Webseiten nicht bei jeder Anforderung neu erzeugt werden. Statisch ist nun mal um ein vielfaches schneller als dynamisch.
Grundsätzlich kommen bie ASP.NET drei Arten zur Anwendung
- Page Level Caching (auch Output Caching genannt)
- Page Fragment Caching (auch Partial-Page Output Caching genannt)
- Programm oder Data Caching
Dabei muss man beim Entwurf von Webanwendungen das Caching nicht einmal berücksichtigen. Zu jeder Zeit lässt sich das Caching einfach in der Page Direktive aktivieren. Der wichtigste Parameter gibt die Zeitdauer in Sekunden an. Nach Ablauf der Duration wird die Seite neu in den Cache geladen, wenn ein Browser sie anfordert.
<%@ outputcache duration="10" %> |
Diese Methode wird Output Caching genannt. Bei der Verwendung von WebMatrix steht sogar ein Assistent dafür bereit.
Vom Output Caching gibt es wie aus dem Bild ersichtlich vier Unterarten.
Vary By None
Die komplette Seite wird für die definierte Zeitspanne in den Server Cache geladen.
<%@ outputcache duration="10" varybyparam="none" %> |
Vary by Custom
Üblicherweise wird hier der Wert Browser übergeben und anhand des Clientbrowsers mehrere Cache Objekte angelegt. Da von Webserver Controls unterschiedlicher HTML COde je Browser erzeugt wird, macht dies durchaus Sinn. Wenn man ein abweichenden Wert als Browser angeibt muss die Umsetzung des Caching manuell implementiert werden. Dazu muss die Methode HttpApplication.GetVaryByCustomString überladen werden.
<%@ outputcache duration="10" varybycustom="browser" %> |
Vary By Param
In dynamischen Websiten kommt es oft vor, das der Inhalt der Website über Paramter gesteuert wird. So kann eine Kundenadresse über show.asp?id=10 angezeigt werden. Wenn hier Caching wirken soll muss für jeden Parameter eine eigener Cache angelegt werden. Über das Attribut werden die Parameter durch Strichpunkte getrennt angegeben.
<%@ outputcache duration="120" varybyparam="Category" %> |
Das ganze funtkioniert nicht nur für Get sondern auch für Post.
Vary By Control
Selbst vom Inhalt eines Formularfeldes kann das Caching abhängig sein. Sinn macht das z.B. für die Auswahl einer Drop Down Box.
In Formularen könnte auch der Einsatzz von Page Fragment Caching nützlich sein. Dies cacht nur Teile der Website.
Vary by Header
Auch in Abhängigkeit von Header Feldern aus dem HTTP Header kann das Caching gesteuert werden . In diesem Beispiel ist es die Spracheinstellung.
<%@ outputcache duration="10" varybyparam="none" varybyheader="Accept-Language" %> |
Nun stellt sich die Frage wie Speicher intensiv das Caching ist. Ein Caching abhängig von ein oder mehreren Parametern kann durchaus gewaltige Datenmengen verursachen. Im Extremfall wird die Anwendung sogar langsamer.
Allerdings wirft das Caching auch einige Fragen auf. So können alte Daten angezeigt werden. Oder was passiert z.B. bei einer Seite die nicht jeder sehen darf, deren dynamischer Inhalt also nur für mich generiert wurde. Solch eine Seite wird durch Authentication geschützt.
Es gibt en zusätzliches Attribut "location" in der der Speicherort angegeben werden kann.
<%@ OutputCache Duration=60 Location="Client" %> |
Um Cache Speicher von zwischengschalteten Servern zu nutzen, z.B. Porxy Server wird der Wert auf Downstream gesetzt.
<%@ OutputCache Duration=60 Location="Downstream" %> |
Die Liste der möglichen Parameter erklärt sich selbst.
Any | Client | Downstream | Server | None
Wie in .NET Framework üblich gibt es eine Klasse die das Caching verwaltet. Diese befindet sich in der Response Klasse und heisst Cache. Damit kann auch aus Codebhind, per Code Einfluss auf das Caching genommen werden.
Response.Cache.SetCacheability(HttpCacheability.Public); |
Das Datacaching wird in einem seperaten Artikel erläutert.