Glengamoi (Forum) · AspHeute · .NET Heute (RSS-Suche) · AspxFiles (Wiki) · .NET Blogs

Output Caching 101

Geschrieben von: Christian Holm
Kategorie: ASP.NET

This printed page brought to you by AlphaSierraPapa

An sich ist das Cachen von Web Seiten ja nichts Neues. Caching ist dann sinnvoll, wenn Daten mit (zeit)aufwendigen Tasks generiert werden müssen, und eigentlich für mehrere User über einen längeren Zeitraum unverändert bleiben. Ein Beispiel wären die Artikelseiten in einem Shop - für jeden User ist die Artikelbeschreibung gleich, also warum sollte man sie jedes Mal aus der Datenbank holen? Daher gibt es Caching: bei wiederholtem Zugriff, je nach Expiration, werden die angeforderten Daten aus dem in-Memory Cache geholt. Dies spart einiges an Web Server Resourcen. Mit ASP.NET haben Sie nun neue Möglichkeiten Caching gezielt und einfach in Ihren Web Seiten zu implementieren.

Grundsätzlich bietet ASP.NET zwei Möglichkeiten vom Caching zu profitieren:

Dieser Artikel soll Ihnen einen Überblick über die ASP.NET Output Caching Funktionalität bieten. Output Caching wird durch die Verwendung der OutputCache Directive aktiviert, welche in diesem Artikel näher betrachtet wird.

Nun zurück zum Thema: Beim Caching werden also die HTTP Requests, die wiederholt gegen den Server gefahren werden, aus einem in-Memory angelegten Cache geholt. Dies spart besonders bei dynamisch generierten Seiten Web Server Resourcen. Das ASP.NET Output Caching Feature (OutputCache Directive) läßt sich nun gezielt an Ihre ASP.NET Anwendungen anpassen. Diese Directive bietet prinzipiell folgende Optionen:

Sie können aber noch Finetuning betreiben, indem Sie folgende Techniken einsetzen:

Diesmal wollen wir uns aber auf das Output Caching beschränken und uns die OutputCache Directive einmal näher ansehen. Das Output Caching Feature basiert auf Caching Policies, die durch die in der Directive teilweise optional festlegbaren Attribute angegeben werden können. In einer ASP.NET Seite kann also die OutputCache Directive folgendermaßen angegeben werden:

<%@ OutputCache Duration="Zeitdauer" Location="Any | Client | Downstream | Server | None" 
VaryByControl="controlname" VaryByCustom="browser | customstring" VaryByHeader="headers" 
VaryByParam="parametername" %>

Die kursiven Angaben stellen die von Ihnen erforderlichen Anpassungen dar. Nun aber die Detailbeschreibungen. Um den Content im Cache nach einer definierten Zeit ablaufen zu lassen, geben Sie bei dem Duration Attribut eine Zeitspanne in Sekunden an:

<%@ OutputCache Duration="180" %>

Was passiert nun? Beim ersten HTTP Request auf die ASP.NET Seite wird der speziell angeforderte Content (die HTTP Response) gleichzeitig im In-Memory Cache abgelegt. Dieser verweilt dann die angegebene Zeitdauer im Cache bevor der Inhalt wieder neu angefordert wird. Dieses Attribut ist zwingend erforderlich und muß daher immer angegeben werden, da es ein Grundattribut für die Cachingpolicy ist.

Das Location Attribut setzt den Typ der Caching-Applikation. Die Werte dieses Atributtes stammen aus der OutputCacheLocation Enumeration, und kann folgende gültige Werte annehmen:

Dies waren die allgemein setzbaren Attribute. Sie können den Cache aber mit folgenden Attributen auf spezielle Anforderungen abstimmen. Die folgenden optionalen Attribute sind möglich:

Das VaryByControl Attribut bietet spezielles Caching für ASP.NET Web Controls und ist daher in der OutputCache Directive von ASP .NET Seiten nicht zulässig. Die Angaben der Web Controls sind als Fully Qualified Names anzugeben, und werden durch Strichprunkte getrennt. Diese Angabe ist für gezieltes Fragment Caching zu verwenden und wird in einem weiteren Artikel näher erläutert.

Beim VaryByCustom Attribut können Sie den Cacheinhalt unter anderem auf verschiedene Browsertypen abstimmen (browser). Bei diesem Setting wird dann nach Browsername und Hauptversionsnummer getrennt. Oder Sie können durch einen eigenen festgelegten String eine Aufteilung bewirken. Hierbei müssen Sie aber beachten, daß Sie bei Verwendung eines eigenen Strings die HttpApplication.GetVaryByCustomString Methode in der gloabl.asax überladen.

Um den Output Cache auf Grundlage von verschiedenen HTTP Headern aufzuteilen, verwenden Sie das VaryByHeader Attribut. Hier wird jede HTTP Response nach Headern gecached. Mehrfachangaben werden durch Strichpunkte getrennt. Da dieses Attribut an ASP.NET Seiten gebunden ist, ist es nicht möglich es bei Web Controls (Fragment Caching) anzugeben.

Wenn Sie den Cache nach Formulardaten, welche mit GET oder POST Methode gesendet worden sind, sortieren wollen, ist das VaryByParam Attribut Ihre Wahl. Hier werden Mehrfachangaben wieder durch Strichpunkte getrennt. Der Cache enthält dann für jeden möglichen Querystring eine separate Http Response der ASP.NET Seite. Hier sind folgende Möglichkeiten gültig:

<%@ OutputCache Duration="180" VaryByParam="*" %>

Mit dieser Angabe ereichen Sie daß alle Abfragen gecached werden. Dies benätigt daher auch den meisten Cache. Wenn Sie aber nur bestimmte Teile der Formulardaten cachen wollen, dann verwenden Sie:

<%@ OutputCache Duration="180" VaryByParam="ProductName;UnitPrice" %>

Diese Angabe sortiert und cached nur Anfragen, die die Parameter ProductName und UnitPrice enthalten. Dieses erforderliche Attribut ist sowohl bei ASP.NET Seiten gültig wie auch bei Web Controls. Wenn Sie diese Aufteilung des Caches deaktivieren wollen, verwenden Sie das none Keyword:

<%@ OutputCache Duration="180" VaryByParam="none" %>

Schlußbemerkung

Dies war ein grober Überblick über das ASP.NET Output Caching. Es wurden die einzelnen Möglichkeiten des Cachens von ASP.NET Seiten gezeigt, und wie man anhand von Parametern den Cache auf bestimmte Spezifikationen aufteilt. Mit diesem Artikel sollte ersichtlich sein, daß das Cachen von ASP.NET Seiten sehr einfach und dennoch (oder gerade deswegen) sehr wirkungsvoll eingesetzt werden kann.

This printed page brought to you by AlphaSierraPapa

Verwandte Artikel

Einstieg in Visual Studio.NET - die erste Webanwendung mit Visual C#
http:/www.aspheute.com/artikel/20031010.htm
HTTP Komprimierung in IIS5
http:/www.aspheute.com/artikel/20001115.htm
Page Fragment Caching 101
http:/www.aspheute.com/artikel/20011009.htm
Serverseitiges Caching mit XCache
http:/www.aspheute.com/artikel/20000817.htm
Vergleich von DataGrid, DataList und Repeater-Control - was verwende ich wann?
http:/www.aspheute.com/artikel/20040303.htm
XTune Revisited
http:/www.aspheute.com/artikel/20011002.htm

Links zu anderen Sites

@ OutputCache Directive
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpgenref/html/cpconoutputcache.asp
ASP.NET Caching Features
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguidnf/html/cpconaspcachingfeatures.asp
Caching ASP.NET Pages
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguidnf/html/cpconaspoutputcache.asp
Performance Tips and Tricks in .NET Applications
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dndotnet/html/dotnetperftips.asp
Setting the Output Cache Location
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguidnf/html/cpconsettingoutputcachelocation.asp

 

©2000-2006 AspHeute.com
Alle Rechte vorbehalten. Der Inhalt dieser Seiten ist urheberrechtlich geschützt.
Eine Übernahme von Texten (auch nur auszugsweise) oder Graphiken bedarf unserer schriftlichen Zustimmung.