Share via


Caching

von Microsoft

Ein Verständnis des Zwischenspeicherns ist wichtig für eine leistungsstarke ASP.NET-Anwendung. ASP.NET 1.x bot drei verschiedene Optionen für das Zwischenspeichern; Ausgabezwischenspeicherung, Fragmentzwischenspeicherung und die Cache-API.

Ein Verständnis des Zwischenspeicherns ist wichtig für eine leistungsstarke ASP.NET-Anwendung. ASP.NET 1.x bot drei verschiedene Optionen für das Zwischenspeichern; Ausgabezwischenspeicherung, Fragmentzwischenspeicherung und die Cache-API. ASP.NET 2.0 bietet alle drei Methoden, fügt jedoch einige wichtige zusätzliche Features hinzu. Es gibt mehrere neue Cacheabhängigkeiten, und Entwickler haben jetzt die Möglichkeit, auch benutzerdefinierte Cacheabhängigkeiten zu erstellen. Auch die Konfiguration der Zwischenspeicherung wurde in ASP.NET 2.0 erheblich verbessert.

Neue Funktionen

Cacheprofile

Mit Cacheprofilen können Entwickler bestimmte Cacheeinstellungen definieren, die dann auf einzelne Seiten angewendet werden können. Wenn Sie beispielsweise einige Seiten haben, die nach 12 Stunden aus dem Cache abgelaufen sein sollen, können Sie ganz einfach ein Cacheprofil erstellen, das auf diese Seiten angewendet werden kann. Um ein neues Cacheprofil hinzuzufügen, verwenden Sie den <Abschnitt outputCacheSettings> in der Konfigurationsdatei. Im Folgenden sehen Sie beispielsweise die Konfiguration eines Cacheprofils namens zwei Tage , das eine Cachedauer von 12 Stunden konfiguriert.

<outputCacheSettings>
    <outputCacheProfiles>
        <add name="TwoDay" duration="43200" />
    </outputCacheProfiles>
</outputCacheSettings>

Um dieses Cacheprofil auf eine bestimmte Seite anzuwenden, verwenden Sie das CacheProfile-Attribut der @OutputCache-Direktive, wie unten gezeigt:

<%@ OutputCache CacheProfile="TwoDay" %>

Benutzerdefinierte Cacheabhängigkeiten

ASP.NET 1.x-Entwickler haben nach benutzerdefinierten Cacheabhängigkeiten ausgerufen. In ASP.NET 1.x wurde die CacheDependency-Klasse versiegelt, wodurch Entwickler daran gehindert wurden, ihre eigenen Klassen daraus abzuleiten. In ASP.NET 2.0 wird diese Einschränkung entfernt, und Entwickler können ihre eigenen benutzerdefinierten Cacheabhängigkeiten entwickeln. Die CacheDependency-Klasse ermöglicht das Erstellen einer benutzerdefinierten Cacheabhängigkeit basierend auf Dateien, Verzeichnissen oder Cacheschlüsseln.

Mit dem folgenden Code wird beispielsweise eine neue benutzerdefinierte Cacheabhängigkeit erstellt, die auf einer Datei namens stuff.xml sich im Stammverzeichnis der Webanwendung befindet:

System.Web.Caching.CacheDependency dep = new
    System.Web.Caching.CacheDependency(Server.MapPath("stuff.xml"));
Response.AddCacheDependency(dep);
Cache.Insert("key", "value");

In diesem Szenario wird das zwischengespeicherte Element ungültig, wenn sich die stuff.xml Datei ändert.

Es ist auch möglich, eine benutzerdefinierte Cacheabhängigkeit mithilfe von Cacheschlüsseln zu erstellen. Bei Verwendung dieser Methode werden die zwischengespeicherten Daten durch entfernen des Cacheschlüssels ungültig. Das folgende Beispiel veranschaulicht dies:

// insert a value into cache that will serve
// as the cache key
Cache["CacheKey"] = "something";

// create an array of cache keys
string[] keys = new String[1];
keys[0] = "CacheKey";

CacheDependency dep = new CacheDependency(null, keys);

// insert an item into cache with a dependency on
// the above CacheDependency
Cache.Insert("Key", "Value", dep);

Um das oben eingefügte Element für ungültig zu erklären, entfernen Sie einfach das Element, das in den Cache eingefügt wurde, um als Cacheschlüssel zu fungieren.

// Remove the cache item that serves as the cache key
Cache.Remove("CacheKey");

Beachten Sie, dass der Schlüssel des Elements, das als Cacheschlüssel fungiert, mit dem Wert identisch sein muss, der dem Array von Cacheschlüsseln hinzugefügt wird.

Polling-Based SQL-Cacheabhängigkeiten (auch als Table-Based-Abhängigkeiten bezeichnet)

SQL Server 7 und 2000 verwenden das abrufbasierte Modell für SQL-Cacheabhängigkeiten. Das abrufbasierte Modell verwendet einen Trigger für eine Datenbanktabelle, der ausgelöst wird, wenn sich Die Daten in der Tabelle ändern. Dieser Trigger aktualisiert ein changeId-Feld in der Benachrichtigungstabelle, das regelmäßig überprüft ASP.NET. Wenn das ChangeId-Feld aktualisiert wurde, weiß ASP.NET, dass sich die Daten geändert haben, und die zwischengespeicherten Daten werden ungültig.

Hinweis

SQL Server 2005 kann auch das abfragebasierte Modell verwenden, aber da das abfragebasierte Modell nicht das effizienteste Modell ist, empfiehlt es sich, ein abfragebasiertes Modell (weiter unten erläutert) mit SQL Server 2005 zu verwenden.

Damit eine SQL-Cacheabhängigkeit mit dem abrufbasierten Modell ordnungsgemäß funktioniert, müssen für die Tabellen Benachrichtigungen aktiviert sein. Dies kann programmgesteuert mithilfe der SqlCacheDependencyAdmin-Klasse oder mithilfe des Hilfsprogramms aspnet_regsql.exe erreicht werden.

Die folgende Befehlszeile registriert die Tabelle Products in der Northwind-Datenbank, die sich auf einer SQL Server instance namens dbase für SQL-Cacheabhängigkeit befindet.

aspnet_regsql -S dbase -ed -d Northwind -E -et -t Products

Im Folgenden finden Sie eine Erläuterung der Befehlszeilenoptionen, die im obigen Befehl verwendet werden:

Befehlszeilenschalter Zweck
-S server Gibt den Servernamen an.
-Ed Gibt an, dass die Datenbank für die SQL-Cacheabhängigkeit aktiviert werden soll.
-d database_name Gibt den Datenbanknamen an, der für die SQL-Cacheabhängigkeit aktiviert werden soll.
-E Gibt an, dass aspnet_regsql beim Herstellen einer Verbindung mit der Datenbank Windows-Authentifizierung verwenden soll.
-Et Gibt an, dass eine Datenbanktabelle für die SQL-Cacheabhängigkeit aktiviert wird.
-t table_name Gibt den Namen der Datenbanktabelle an, die für die SQL-Cacheabhängigkeit aktiviert werden soll.

Hinweis

Für aspnet_regsql.exe stehen weitere Switches zur Verfügung. Führen Sie aspnet_regsql.exe -? aus, um eine vollständige Liste zu erstellen. über eine Befehlszeile.

Wenn dieser Befehl ausgeführt wird, werden die folgenden Änderungen an der SQL Server-Datenbank vorgenommen:

  • Eine AspNet_SqlCacheTablesForChangeNotification Tabelle wird hinzugefügt. Diese Tabelle enthält eine Zeile für jede Tabelle in der Datenbank, für die eine SQL-Cacheabhängigkeit aktiviert wurde.
  • Die folgenden gespeicherten Prozeduren werden in der Datenbank erstellt:
AspNet_SqlCachePollingStoredProcedure Fragt die AspNet_SqlCacheTablesForChangeNotification Tabelle ab und gibt alle Tabellen zurück, die für die SQL-Cacheabhängigkeit aktiviert sind, und den Wert von changeId für jede Tabelle. Dieser gespeicherte Proc wird für Abfragen verwendet, um festzustellen, ob sich Die Daten geändert haben.
AspNet_SqlCacheQueryRegisteredTablesStoredProcedure Gibt alle Tabellen zurück, die für die SQL-Cacheabhängigkeit aktiviert sind, indem die AspNet_SqlCacheTablesForChangeNotification Tabelle abgefragt wird, und alle Tabellen zurückgegeben werden, die für die SQL-Cacheabhängigkeit aktiviert sind.
AspNet_SqlCacheRegisterTableStoredProcedure Registriert eine Tabelle für die SQL-Cacheabhängigkeit, indem der erforderlichen Eintrag in der Benachrichtigungstabelle hinzugefügt und der Trigger hinzugefügt wird.
AspNet_SqlCacheUnRegisterTableStoredProcedure Hebt die Registrierung einer Tabelle für SQL-Cacheabhängigkeiten auf, indem der Eintrag in der Benachrichtigungstabelle entfernt und der Trigger entfernt wird.
AspNet_SqlCacheUpdateChangeIdStoredProcedure Updates die Benachrichtigungstabelle, indem Sie die changeId für die geänderte Tabelle erhöhen. ASP.NET verwendet diesen Wert, um zu bestimmen, ob sich die Daten geändert haben. Wie unten angegeben, wird dieser gespeicherte Proc von dem Trigger ausgeführt, der erstellt wird, wenn die Tabelle aktiviert ist.
  • Ein SQL Server-Trigger namens table_name_AspNet_SqlCacheNotification_Trigger wird für die Tabelle erstellt. Dieser Trigger führt den AspNet_SqlCacheUpdateChangeIdStoredProcedure aus, wenn ein INSERT, UPDATE oder DELETE für die Tabelle ausgeführt wird.
  • Der Datenbank wird eine SQL Server Rolle namens aspnet_ChangeNotification_ReceiveNotificationsOnlyAccess hinzugefügt.

Die aspnet_ChangeNotification_ReceiveNotificationsOnlyAccess SQL Server Rolle verfügt über EXEC-Berechtigungen für die AspNet_SqlCachePollingStoredProcedure. Damit das Abrufmodell ordnungsgemäß funktioniert, müssen Sie Ihr Prozesskonto der Rolle aspnet_ChangeNotification_ReceiveNotificationsOnlyAccess hinzufügen. Das aspnet_regsql.exe Tool macht dies nicht für Sie.

Konfigurieren von Polling-Based SQL-Cacheabhängigkeiten

Es gibt mehrere Schritte, die zum Konfigurieren von abrufbasierten SQL-Cacheabhängigkeiten erforderlich sind. Der erste Schritt besteht darin, die Datenbank und die Tabelle wie oben beschrieben zu aktivieren. Nachdem dieser Schritt abgeschlossen ist, sieht der Rest der Konfiguration wie folgt aus:

  • Konfigurieren der ASP.NET-Konfigurationsdatei.
  • Konfigurieren der SqlCacheDependency

Konfigurieren der ASP.NET-Konfigurationsdatei

Zusätzlich zum Hinzufügen einer Verbindungszeichenfolge, wie in einem vorherigen Modul beschrieben, müssen Sie auch ein <Cacheelement> mit einem <sqlCacheDependency-Element> konfigurieren, wie unten gezeigt:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <connectionStrings>
    <add name="Pubs"
    connectionString="Data Source=(local);
      Initial Catalog=pubs;Integrated Security=true;"
    providerName="System.Data.SqlClient" />
  </connectionStrings>
  <system.web>
    <caching>
      <sqlCacheDependency enabled = "true" pollTime = "60000" >
        <databases>
          <add name="pubs" connectionStringName = "pubs" pollTime = "9000000" />
        </databases>
      </sqlCacheDependency>
    </caching>
  </system.web>
</configuration>

Diese Konfiguration ermöglicht eine SQL-Cacheabhängigkeit von der Pubs-Datenbank . Beachten Sie, dass das pollTime-Attribut im <sqlCacheDependency-Element> standardmäßig auf 60000 Millisekunden oder 1 Minute festgelegt ist. (Dieser Wert darf nicht kleiner als 500 Millisekunden sein.) In diesem Beispiel fügt das <add-Element> eine neue Datenbank hinzu und überschreibt pollTime und legt sie auf 9000000 Millisekunden fest.

Konfigurieren der SqlCacheDependency

Der nächste Schritt besteht darin, die SqlCacheDependency zu konfigurieren. Die einfachste Möglichkeit, dies zu erreichen, besteht darin, den Wert für das SqlDependency-Attribut in der @ Outcache-Direktive wie folgt anzugeben:

<%@ OutputCache duration="60"
    VaryByParam="none" SqlDependency="pubs:authors" %>

In der obigen @OutputCache-Direktive wird eine SQL-Cacheabhängigkeit für die Tabelle authors in der Pubs-Datenbank konfiguriert. Mehrere Abhängigkeiten können konfiguriert werden, indem sie wie folgt durch einen Semikolon getrennt werden:

<%@ OutputCache duration="60"
    VaryByParam="none"
    SqlDependency="database_name:table_name;database_name:table_name" %>

Eine weitere Methode zum Konfigurieren von SqlCacheDependency besteht darin, dies programmgesteuert zu tun. Der folgende Code erstellt eine neue SQL-Cacheabhängigkeit von der Tabelle authors in der Pubs-Datenbank .

SqlCacheDependency dep = new SqlCacheDependency("pubs", "authors");

Einer der Vorteile der programmgesteuerten Definition der SQL-Cacheabhängigkeit besteht darin, dass Sie alle eventuell auftretenden Ausnahmen behandeln können. Wenn Sie beispielsweise versuchen, eine SQL-Cacheabhängigkeit für eine Datenbank zu definieren, die nicht für Benachrichtigungen aktiviert wurde, wird eine DatabaseNotEnabledForNotificationException-Ausnahme ausgelöst. In diesem Fall können Sie versuchen, die Datenbank für Benachrichtigungen zu aktivieren, indem Sie die SqlCacheDependencyAdmin.EnableNotifications-Methode aufrufen und ihr den Datenbanknamen übergeben.

Wenn Sie ebenfalls versuchen, eine SQL-Cacheabhängigkeit für eine Tabelle zu definieren, die nicht für Benachrichtigungen aktiviert wurde, wird eine TableNotEnabledForNotificationException ausgelöst. Anschließend können Sie die SqlCacheDependencyAdmin.EnableTableForNotifications-Methode aufrufen und ihr den Datenbank- und Tabellennamen übergeben.

Im folgenden Codebeispiel wird veranschaulicht, wie Sie die Ausnahmebehandlung beim Konfigurieren einer SQL-Cacheabhängigkeit ordnungsgemäß konfigurieren.

try {
    SqlCacheDependency SqlDep = new
    SqlCacheDependency("pubs", "authors");
} catch (DatabaseNotEnabledForNotificationException exDBDis) {
    try {
        SqlCacheDependencyAdmin.EnableNotifications("pubs");
    } catch (UnauthorizedAccessException exPerm) {
        Response.Redirect("ErrorPage.htm");
    }
} catch (TableNotEnabledForNotificationException exTabDis) {
    try {
        SqlCacheDependencyAdmin.EnableTableForNotifications("pubs",
        "authors");
    } catch (System.Data.SqlClient.SqlException exc) {
        Response.Redirect("ErrorPage.htm");
    }
} finally {
    Cache.Insert("SqlSource", Source1, SqlDep);
}

Weitere Informationen: https://msdn.microsoft.com/library/t9x04ed2.aspx

Query-Based SQL-Cacheabhängigkeiten (nur SQL Server 2005)

Wenn Sie SQL Server 2005 für SQL-Cacheabhängigkeit verwenden, ist das abfragebasierte Modell nicht erforderlich. Bei Verwendung mit SQL Server 2005 kommunizieren SQL-Cacheabhängigkeiten direkt über SQL-Verbindungen mit dem SQL Server instance (es ist keine weitere Konfiguration erforderlich) über SQL Server 2005-Abfragebenachrichtigungen.

Die einfachste Möglichkeit, abfragebasierte Benachrichtigungen zu aktivieren, besteht darin, dies deklarativ zu tun, indem Sie das SqlCacheDependency-Attribut des Datenquellenobjekts auf CommandNotification festlegen und das EnableCaching-Attribut auf true festlegen. Bei Verwendung dieser Methode ist kein Code erforderlich. Wenn sich das Ergebnis eines Befehls ändert, der für die Datenquelle ausgeführt wird, werden die Cachedaten ungültig.

Im folgenden Beispiel wird ein Datenquellensteuerelement für SQL-Cacheabhängigkeiten konfiguriert:

<asp:SqlDataSource ID="ProductList" runat="server"
    ConnectionString="<%$ ConnectionStrings:Northwind %>"
    EnableCaching="true"
    SqlCacheDependency="CommandNotification"
    SelectCommand="SELECT * FROM [Products]" />

Wenn in diesem Fall die in SelectCommand angegebene Abfrage ein anderes Ergebnis als ursprünglich zurückgibt, werden die zwischengespeicherten Ergebnisse ungültig.

Sie können auch angeben, dass alle Ihre Datenquellen für SQL-Cacheabhängigkeiten aktiviert werden, indem Sie das SqlDependency-Attribut der @ OutputCache-Direktive auf CommandNotification festlegen. Das folgende Beispiel veranschaulicht dies.

<%@ OutputCache SqlDependency="CommandNotification" 
    duration="60" VaryByParam="none" %>

Hinweis

Weitere Informationen zu Abfragebenachrichtigungen in SQL Server 2005 finden Sie in der SQL Server-Onlinedokumentation.

Eine weitere Methode zum Konfigurieren einer abfragebasierten SQL-Cacheabhängigkeit ist die programmgesteuerte Verwendung der SqlCacheDependency-Klasse. Das folgende Codebeispiel veranschaulicht, wie dies erreicht wird.

string sql = "SELECT ProductName, ProductID FROM Products";
SqlConnection conn = new
SqlConnection(ConfigurationManager.ConnectionStrings["Northwind"].ConnectionString);
SqlCommand cmd = new SqlCommand(sql, conn);
SqlCacheDependency dep = new SqlCacheDependency(cmd);
Response.AddCacheDependency(dep);

Weitere Informationen: https://msdn.microsoft.com/library/default.asp?url=/library/enus/dnvs05/html/querynotification.asp

Post-Cache-Ersetzung

Das Zwischenspeichern einer Seite kann die Leistung einer Webanwendung erheblich erhöhen. In einigen Fällen muss jedoch der größte Teil der Seite zwischengespeichert werden, und einige Fragmente innerhalb der Seite müssen dynamisch sein. Wenn Sie beispielsweise eine Seite mit Nachrichten erstellen, die für einen bestimmten Zeitraum vollständig statisch ist, können Sie festlegen, dass die gesamte Seite zwischengespeichert wird. Wenn Sie ein rotierendes Anzeigenbanner einschließen möchten, das sich bei jeder Seitenanforderung geändert hat, muss der Teil der Seite, der die Werbung enthält, dynamisch sein. Damit Sie eine Seite zwischenspeichern, aber einige Inhalte dynamisch ersetzen können, können Sie ASP.NET Ersatz nach dem Cache verwenden. Bei der Ersetzung nach dem Cache wird die gesamte Seite zwischengespeichert, wobei bestimmte Teile als vom Zwischenspeichern ausgenommen gekennzeichnet sind. Im Beispiel der Anzeigenbanner können Sie mit dem AdRotator-Steuerelement die Vorteile der Ersetzung nach dem Cache nutzen, sodass Anzeigen dynamisch für jeden Benutzer und für jede Seitenaktualisierung erstellt werden.

Es gibt drei Möglichkeiten, die Ersetzung nach dem Cache zu implementieren:

  • Deklarativ mithilfe des Substitutionssteuerelements.
  • Programmgesteuert mithilfe der Substitutionssteuerungs-API.
  • Implizit mithilfe des AdRotator-Steuerelements.

Substitutionssteuerung

Das ASP.NET Substitution-Steuerelement gibt einen Abschnitt einer zwischengespeicherten Seite an, der dynamisch erstellt und nicht zwischengespeichert wird. Sie platzieren ein Substitutionssteuerelement an der Stelle auf der Seite, an der der dynamische Inhalt angezeigt werden soll. Zur Laufzeit ruft das Substitutionssteuerelement eine Methode auf, die Sie mit der MethodName-Eigenschaft angeben. Die -Methode muss eine Zeichenfolge zurückgeben, die dann den Inhalt des Substitutionssteuerelements ersetzt. Die Methode muss eine statische Methode für das enthaltende Page- oder UserControl-Steuerelement sein. Die Verwendung des Substitutionssteuerelements bewirkt, dass die clientseitige Zwischenspeicherbarkeit in die Zwischenspeicherbarkeit des Servers geändert wird, sodass die Seite nicht auf dem Client zwischengespeichert wird. Dadurch wird sichergestellt, dass zukünftige Anforderungen an die Seite die -Methode erneut aufrufen, um dynamischen Inhalt zu generieren.

Ersetzungs-API

Um dynamische Inhalte für eine zwischengespeicherte Seite programmgesteuert zu erstellen, können Sie die WriteSubstitution-Methode im Seitencode aufrufen und ihr den Namen einer Methode als Parameter übergeben. Die Methode, die die Erstellung des dynamischen Inhalts übernimmt einen einzelnen HttpContext-Parameter und gibt eine Zeichenfolge zurück. Die Rückgabezeichenfolge ist der Inhalt, der an der angegebenen Position ersetzt wird. Ein Vorteil des Aufrufens der WriteSubstitution-Methode anstelle der deklarativen Verwendung des Substitutionssteuerelements besteht darin, dass Sie eine Methode eines beliebigen Objekts aufrufen können, anstatt eine statische Methode des Page- oder userControl-Objekts aufzurufen.

Durch das Aufrufen der WriteSubstitution-Methode wird die clientseitige Zwischenspeicherbarkeit in die Zwischenspeicherbarkeit des Servers geändert, sodass die Seite nicht auf dem Client zwischengespeichert wird. Dadurch wird sichergestellt, dass zukünftige Anforderungen an die Seite die -Methode erneut aufrufen, um dynamischen Inhalt zu generieren.

AdRotator-Steuerelement

Das AdRotator-Serversteuerelement implementiert intern Unterstützung für die Ersetzung nach dem Cache. Wenn Sie ein AdRotator-Steuerelement auf Ihrer Seite platzieren, werden für jede Anforderung eindeutige Ankündigungen gerendert, unabhängig davon, ob die übergeordnete Seite zwischengespeichert wird. Daher wird eine Seite, die ein AdRotator-Steuerelement enthält, nur serverseitig zwischengespeichert.

ControlCachePolicy-Klasse

Die ControlCachePolicy-Klasse ermöglicht die programmgesteuerte Steuerung der Fragmentzwischenspeicherung mithilfe von Benutzersteuerelementen. ASP.NET bettet Benutzersteuerelemente in eine BasePartialCachingControl-instance ein. Die BasePartialCachingControl-Klasse stellt ein Benutzersteuerelement dar, für das die Ausgabezwischenspeicherung aktiviert ist.

Wenn Sie auf die BasePartialCachingControl.CachePolicy-Eigenschaft eines PartialCachingControl-Steuerelements zugreifen, erhalten Sie immer ein gültiges ControlCachePolicy-Objekt. Wenn Sie jedoch auf die UserControl.CachePolicy-Eigenschaft eines UserControl-Steuerelements zugreifen, erhalten Sie nur dann ein gültiges ControlCachePolicy-Objekt, wenn das Benutzersteuerelement bereits von einem BasePartialCachingControl-Steuerelement umschlossen ist. Wenn es nicht umschlossen wird, löst das von der -Eigenschaft zurückgegebene ControlCachePolicy-Objekt Ausnahmen aus, wenn Sie versuchen, es zu bearbeiten, da es kein zugeordnetes BasePartialCachingControl-Objekt enthält. Überprüfen Sie die SupportsCaching-Eigenschaft, um zu ermitteln, ob ein UserControl-instance die Zwischenspeicherung unterstützt, ohne Ausnahmen zu generieren.

Die Verwendung der ControlCachePolicy-Klasse ist eine von mehreren Möglichkeiten, die Ausgabezwischenspeicherung zu aktivieren. In der folgenden Liste werden Methoden beschrieben, die Sie zum Aktivieren der Ausgabezwischenspeicherung verwenden können:

  • Verwenden Sie die @ OutputCache-Direktive , um die Ausgabezwischenspeicherung in deklarativen Szenarien zu aktivieren.
  • Verwenden Sie das PartialCachingAttribute-Attribut , um die Zwischenspeicherung für ein Benutzersteuerelement in einer CodeBehind-Datei zu aktivieren.
  • Verwenden Sie die ControlCachePolicy-Klasse, um Cacheeinstellungen in programmgesteuerten Szenarien anzugeben, in denen Sie mit BasePartialCachingControl-Instanzen arbeiten, die mit einer der vorherigen Methoden cacheaktiviert und dynamisch mit der System.Web.UI.TemplateControl.LoadControl-Methode geladen wurden.

Eine ControlCachePolicy-instance kann nur zwischen den Phasen Init und PreRender des Steuerelementlebenszyklus erfolgreich bearbeitet werden. Wenn Sie ein ControlCachePolicy-Objekt nach der PreRender-Phase ändern, löst ASP.NET eine Ausnahme aus, da alle Änderungen, die nach dem Rendern des Steuerelements vorgenommen wurden, die Cacheeinstellungen nicht tatsächlich beeinflussen können (ein Steuerelement wird während der Renderphase zwischengespeichert). Schließlich ist ein Benutzersteuerelement instance (und damit sein ControlCachePolicy-Objekt) nur für programmgesteuerte Bearbeitungen verfügbar, wenn es tatsächlich gerendert wird.

Änderungen an der Zwischenspeicherungskonfiguration : Das <Cacheelement>

Es gibt mehrere Änderungen an der Zwischenspeicherungskonfiguration in ASP.NET 2.0. Das <Cacheelement> ist neu in ASP.NET 2.0 und ermöglicht Es Ihnen, Änderungen an der Zwischenspeicherungskonfiguration in der Konfigurationsdatei vorzunehmen. Die folgenden Attribute sind verfügbar.

Element Beschreibung
cache Optionales Element. Definiert globale Anwendungscacheeinstellungen.
Outputcache Optionales Element. Gibt anwendungsweite Ausgabecacheeinstellungen an.
outputCacheSettings Optionales Element. Gibt Ausgabecacheeinstellungen an, die auf Seiten in der Anwendung angewendet werden können.
sqlCacheDependency Optionales Element. Konfiguriert die SQL-Cacheabhängigkeiten für eine ASP.NET-Anwendung.

Das <Cacheelement>

Die folgenden Attribute sind im <Cacheelement> verfügbar:

Attribut Beschreibung
disableMemoryCollection Optionales boolesches Attribut. Ruft einen Wert ab, der angibt, ob die Cachespeichersammlung, die auftritt, wenn der Computer unter Arbeitsspeicherdruck steht, deaktiviert ist, oder legt diesen fest.
disableExpiration Optionales boolesches Attribut. Ruft einen Wert ab, der angibt, ob der Cacheablauf deaktiviert ist, oder legt den Wert fest. Wenn sie deaktiviert sind, laufen zwischengespeicherte Elemente nicht ab, und das Hintergrundabfangen abgelaufener Cacheelemente erfolgt nicht.
privateBytesLimit Optionales Int64-Attribut. Ruft einen Wert ab, der die maximale Größe der privaten Bytes einer Anwendung angibt, bevor der Cache mit dem Leeren abgelaufener Elemente und dem Versuch, Arbeitsspeicher zurückzugeben, beginnt, oder legt diesen fest. Dieser Grenzwert umfasst sowohl den vom Cache verwendeten Arbeitsspeicher als auch den normalen Arbeitsspeicheraufwand der ausgeführten Anwendung. Die Einstellung 0 (null) gibt an, dass ASP.NET eine eigene Heuristik verwendet, um zu bestimmen, wann mit dem Freigeben von Arbeitsspeicher begonnen werden soll.
percentagePhysicalMemoryUsedLimit Optionales Int32-Attribut. Ruft einen Wert ab, der den maximalen Prozentsatz des physischen Arbeitsspeichers eines Computers angibt, der von einer Anwendung genutzt werden kann, bevor der Cache mit dem Leeren abgelaufener Elemente beginnt und versucht, Arbeitsspeicher zurückzugeben. Diese Speicherauslastung umfasst sowohl den vom Cache verwendeten Arbeitsspeicher als auch die normale Speicherauslastung der ausgeführten Anwendung. Die Einstellung 0 (null) gibt an, dass ASP.NET eine eigene Heuristik verwendet, um zu bestimmen, wann mit dem Freigeben von Arbeitsspeicher begonnen werden soll.
privateBytesPollTime Optionales TimeSpan-Attribut. Ruft einen Wert ab, der das Zeitintervall zwischen dem Abrufen der Speicherauslastung privater Bytes der Anwendung angibt, oder legt den Wert fest.

Das <outputCache-Element>

Die folgenden Attribute sind für das <outputCache-Element> verfügbar.

Attribut Beschreibung
enableOutputCache Optionales boolesches Attribut. Aktiviert/deaktiviert den Seitenausgabecache. Wenn diese Option deaktiviert ist, werden keine Seiten zwischengespeichert, unabhängig von den programmgesteuerten oder deklarativen Einstellungen. Der Standardwert lautet true.
enableFragmentCache Optionales boolesches Attribut. Aktiviert/deaktiviert den Anwendungsfragmentcache. Wenn diese Option deaktiviert ist, werden keine Seiten zwischengespeichert, unabhängig von der @OutputCache-Direktive oder dem verwendeten Zwischenspeicherungsprofil. Enthält einen Cachesteuerungsheader, der angibt, dass Upstream Proxyserver sowie Browserclients nicht versuchen sollten, die Seitenausgabe zwischenzuspeichern. Der Standardwert ist false.
sendCacheControlHeader Optionales boolesches Attribut. Ruft einen Wert ab, der angibt, ob der cache-control:private-Header standardmäßig vom Ausgabecachemodul gesendet wird, oder legt ihn fest. Der Standardwert ist false.
omitVaryStar Optionales boolesches Attribut. Aktiviert/deaktiviert das Senden eines HTTP-Headers "Vary: </strong>" in der Antwort. Bei der Standardeinstellung false wird ein "*Vary: *"-Header für zwischengespeicherte Ausgabeseiten gesendet. Wenn der Vary-Header gesendet wird, können unterschiedliche Versionen basierend auf den im Vary-Header angegebenen Versionen zwischengespeichert werden. Beispielsweise speichert Vary:User-Agents unterschiedliche Versionen einer Seite basierend auf dem Benutzer-Agent, der die Anforderung ausstellt. Der Standardwert ist **false.

Das <outputCacheSettings-Element>

Das <outputCacheSettings-Element> ermöglicht die Erstellung von Cacheprofilen wie zuvor beschrieben. Das einzige untergeordnete Element für das <outputCacheSettings-Element> ist das <outputCacheProfiles-Element> zum Konfigurieren von Cacheprofilen.

Das <sqlCacheDependency-Element>

Die folgenden Attribute sind für das <sqlCacheDependency-Element> verfügbar.

Attribut Beschreibung
enabled Erforderliches boolesches Attribut. Gibt an, ob Änderungen abgefragt werden.
pollTime Optionales Int32-Attribut. Legt die Häufigkeit fest, mit der sqlCacheDependency die Datenbanktabelle auf Änderungen abruft. Dieser Wert entspricht der Anzahl von Millisekunden zwischen aufeinander folgenden Abrufen. Er kann nicht auf weniger als 500 Millisekunden festgelegt werden. Der Standardwert ist 1 Minute.

Weitere Informationen

Es gibt einige zusätzliche Informationen, die Sie zur Cachekonfiguration beachten sollten.

  • Wenn der Grenzwert für private Bytes des Arbeitsprozesses nicht festgelegt ist, verwendet der Cache einen der folgenden Grenzwerte:

    • x86 2GB: 800 MB oder 60 % des physischen RAM, je nachdem, welcher Wert kleiner ist
    • x86 3GB: 1800 MB oder 60 % des physischen RAM, je nachdem, welcher Wert kleiner ist
    • x64: 1 Terabyte oder 60 % des physischen RAM, je nachdem, welcher Wert kleiner ist
  • Wenn sowohl der Grenzwert für private Bytes des Arbeitsprozesses als <auch der Cache privateBytesLimit/> festgelegt sind, verwendet der Cache das Minimum der beiden.

  • Genau wie in 1.x löschen wir Cacheeinträge und rufen GC auf. Sammeln aus zwei Gründen:

    • Wir sind sehr nah am Grenzwert für private Bytes.
    • Der verfügbare Arbeitsspeicher ist nahe oder kleiner als 10 %
  • Sie können die Kürzung und den Cache für gering verfügbare Speicherbedingungen effektiv deaktivieren, indem Sie den CacheprozentsatzPhysicalMemoryUseLimit/> auf 100 festlegen<.

  • Im Gegensatz zu 1.x hält 2.0 die Kürzung an und sammelt Aufrufe, wenn der letzte GC-Code verwendet wird. Collect hat private Bytes oder die Größe der verwalteten Heaps nicht um mehr als 1 % des Arbeitsspeicherlimits (Cache) reduziert.

Lab1: Benutzerdefinierte Cacheabhängigkeiten

  1. Erstellen Sie eine neue Website.

  2. Fügen Sie eine neue XML-Datei namens cache.xml hinzu, und speichern Sie sie im Stammverzeichnis der Webanwendung.

  3. Fügen Sie der Page_Load-Methode im CodeBehind von default.aspx den folgenden Code hinzu:

    System.Web.Caching.CacheDependency dep = new
        System.Web.Caching.CacheDependency(Server.MapPath("cache.xml"));
    Response.AddCacheDependency(dep);
    Cache.Insert("time", DateTime.Now.ToString());
    Response.Write(Cache["time"]);
    
  4. Fügen Sie am Anfang von default.aspx in der Quellansicht Folgendes hinzu:

    <%@ OutputCache Duration="240" VaryByParam="None" %>
    
  5. Durchsuchen Sie Default.aspx. Was sagt die Zeit?

  6. Aktualisieren Sie den Browser. Was sagt die Zeit?

  7. Öffnen Sie cache.xml, und fügen Sie den folgenden Code hinzu:

    <anElement></anElement>
    
  8. Speichern Sie cache.xml.

  9. Aktualisieren Sie Ihren Browser. Was sagt die Zeit?

  10. Erläutern Sie, warum die Zeit aktualisiert wurde, anstatt die zuvor zwischengespeicherten Werte anzuzeigen:

Lab 2: Verwenden von Polling-Based Cacheabhängigkeiten

Dieses Lab verwendet das Projekt, das Sie im vorherigen Modul erstellt haben und das die Bearbeitung von Daten in der Northwind-Datenbank über ein GridView- und DetailsView-Steuerelement ermöglicht.

  1. Öffnen Sie das Projekt in Visual Studio 2005.

  2. Führen Sie das Hilfsprogramm aspnet_regsql für die Northwind-Datenbank aus, um die Datenbank und die Tabelle Products zu aktivieren. Verwenden Sie den folgenden Befehl an einer Visual Studio-Eingabeaufforderung:

    aspnet_regsql -S server -ed -d Northwind -E -et -t Products
    
  3. Fügen Sie Ihrer web.config-Datei Folgendes hinzu:

    <caching>
        <sqlCacheDependency enabled = "true" pollTime = "60000" >
            <databases>
                <add name="Northwind" connectionStringName = "Northwind" pollTime = "9000000" />
            </databases>
        </sqlCacheDependency>
    </caching>
    
  4. Fügen Sie ein neues Webformular namens showdata.aspx hinzu.

  5. Fügen Sie der Seite showdata.aspx die folgende @ outputcache-Direktive hinzu:

    <%@ OutputCache SqlDependency="Northwind:Products" Duration="480" VaryByParam="None"%>
    
  6. Fügen Sie dem Page_Load von showdata.aspx den folgenden Code hinzu:

    Response.Write(DateTime.Now.ToString() + "<br><br>");
    
  7. Fügen Sie ein neues SqlDataSource-Steuerelement zu showdata.aspx hinzu, und konfigurieren Sie es für die Verwendung der Northwind-Datenbankverbindung. Klicken Sie auf Weiter .

  8. Aktivieren Sie die Kontrollkästchen ProductName und ProductID, und klicken Sie auf Weiter.

  9. Klicken Sie auf Fertig stellen.

  10. Fügen Sie der Seite showdata.aspx ein neues GridView hinzu.

  11. Wählen Sie in der Dropdownliste SqlDataSource1 aus.

  12. Speichern und durchsuchen Sie showdata.aspx. Notieren Sie sich die angezeigte Zeit.