Freigeben über


Exemplarische Vorgehensweise: Zwischenspeichern von Anwendungsdaten in ASP.NET

Mithilfe der Zwischenspeicherung können Daten für einen schnellen Zugriff im Arbeitsspeicher gespeichert werden. Anwendungen können auf den Cache zugreifen und müssen die Daten nicht jedes Mal, wenn auf die Daten zugegriffen wird, aus der ursprünglichen Quelle abrufen. Hierdurch werden wiederholte Abfragen von Daten vermieden, und Leistung und Skalierbarkeit können verbessert werden. Zudem bietet die Zwischenspeicherung den Vorteil, dass Daten auch zur Verfügung stehen, wenn die Datenquelle vorübergehend nicht verfügbar ist.

.NET Framework stellt Klassen bereit, die das Verwenden von Zwischenspeicherungsfunktionen in ASP.NET-Anwendungen ermöglichen. Diese Klassen werden im System.Runtime.Caching-Namespace definiert.

Hinweis

Der System.Runtime.Caching-Namespace ist neu in .NET Framework 4.Dieser Namespace ermöglicht das Zwischenspeichern für alle .NET Framework-Anwendungen.

In dieser exemplarischen Vorgehensweise wird die Verwendung der Zwischenspeicherungsfunktionen erläutert, die in .NET Framework als Teil einer ASP.NET-Anwendung verfügbar sind. In der exemplarischen Vorgehensweise wird der Inhalt einer Textdatei zwischengespeichert.

In dieser exemplarischen Vorgehensweise werden u. a. die folgenden Aufgaben veranschaulicht:

  • Erstellen einer ASP.NET-Website.

  • Hinzufügen eines Verweises zu .NET Framework 4

  • Hinzufügen eines Cacheeintrags, der den Inhalt einer Datei zwischenspeichert

  • Bereitstellen einer Entfernungsrichtlinie für den Cacheeintrag

  • Überwachen des Pfads der zwischengespeicherten Datei und Benachrichtigen des Caches über Änderungen an den überwachten Elementen

Vorbereitungsmaßnahmen

Für die Durchführung dieser exemplarischen Vorgehensweise benötigen Sie Folgendes:

  • Microsoft Visual Studio 2010.

  • Eine Textdatei, die eine kleine Menge an Text enthält. Sie zeigen den Inhalt dieser Textdatei in einer Webseite an.

Erstellen einer ASP.NET-Website

Als Erstes erstellen Sie eine ASP.NET-Website.

Warnung

In dieser exemplarischen Vorgehensweise wird ein Websiteprojekt verwendet.Sie könnten stattdessen ein Webanwendungsprojekt verwenden.Informationen darüber, wie sich diese Webprojekttypen unterscheiden, finden Sie unter Vergleich von Webanwendungsprojekten und Websiteprojekten.

So erstellen Sie eine ASP.NET-Website

  1. Starten Sie Visual Studio 2010.

  2. Klicken Sie im Menü Datei auf Neue Website. (Alternativ können Sie auch auf Neu und dann auf Website klicken.)

    Das Dialogfeld Neue Website wird angezeigt.

  3. Klicken Sie unter Installierte Vorlagen auf Visual Basic oder C#, und wählen Sie dann ASP.NET-Website aus.

  4. Wählen Sie im Feld Website die Option Dateisystem aus, und geben Sie den Namen des Ordners ein, in dem Sie die Seiten der Website speichern möchten. Geben Sie z. B. den Ordnernamen "C:\Websites\AppCaching" ein, und klicken Sie dann auf OK.

    Von Visual Studio wird ein Webprojekt erstellt, das vordefinierte Funktionen für das Layout (eine Gestaltungsvorlage, die Inhaltsseiten Default.aspx und About.aspx und ein Cascading Stylesheet), AJAX (Clientskriptdateien) und die Authentifizierung (ASP.NET-Mitgliedschaft) enthält. Wenn eine neue Seite erstellt wird, zeigt Visual Web Developer diese standardmäßig in der Quellansicht an, in der die HTML-Elemente der Seite sichtbar sind.

Als nächster Schritt wird die Textdatei hinzugefügt, die Sie im aktuellen Websiteprojekt verwenden möchten.

So fügen Sie die Textdatei dem Projekt hinzu

  1. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf den Projektnamen, und klicken Sie dann auf Vorhandenes Element hinzufügen.

  2. Wählen Sie im Dialogfeld Vorhandenes Element hinzufügen die Textdatei aus, die Sie für diese exemplarische Vorgehensweise verwenden möchten, und klicken Sie dann auf Hinzufügen.

Hinzufügen eines Verweises auf die Assembly zum Zwischenspeichern

Um den System.Runtime.Caching-Namespace in einer ASP.NET-Anwendung zu verwenden, müssen Sie einen Verweis auf den Namespace hinzufügen.

So fügen Sie einen Verweis auf die Website hinzu

  1. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf die Website, und klicken Sie anschließend auf Verweis hinzufügen.

  2. Wählen Sie auf der Registerkarte .NET die Option System.Runtime.Caching aus, und klicken Sie dann auf OK.

Hinzufügen von Steuerelementen zur ASP.NET-Seite

Als Nächstes fügen Sie der Seite eine Schaltfläche und ein Label-Steuerelement hinzu. Sie erstellen einen Ereignishandler für das Click-Ereignis der Schaltfläche. Später fügen Sie Code hinzu, damit nach dem Klicken auf die Schaltfläche der zwischengespeicherte Text im Label-Steuerelement angezeigt wird.

So fügen Sie der Seite Steuerelemente hinzu

  1. Öffnen Sie die Seite "Default.aspx", oder wechseln Sie zu dieser Seite.

  2. Ziehen Sie aus der Registerkarte Standard der Toolbox ein Button-Steuerelement auf die Seite "Default.aspx".

  3. Legen Sie im Eigenschaftenfenster die Text-Eigenschaft des Button-Steuerelements auf "Aus Cache abrufen" fest: Akzeptieren Sie die Standard-ID-Eigenschaft.

  4. Ziehen Sie aus der Registerkarte Standard der Toolbox ein Label-Steuerelement auf die Seite. Akzeptieren Sie die Standard-ID-Eigenschaft.

Erstellen des Caches und Zwischenspeichern eines Eintrags

Als Nächstes fügen Sie den Code hinzu, um die folgenden Aufgaben auszuführen:

  • Erstellen Sie eine Instanz der Cacheklasse – d. h. Sie instanziieren das Cacheobjekt.

  • Geben Sie an, dass der Cache ein HostFileChangeMonitor-Objekt zum Überwachen der Änderungen in der Textdatei verwendet.

  • Lesen Sie die Textdatei, und zwischenspeichern Sie den Inhalt als Cacheeintrag.

  • Zeigen Sie den Inhalt der zwischengespeicherten Textdatei an.

So erstellen Sie das Cacheobjekt

  1. Doppelklicken Sie auf die Schaltfläche, um in der Datei "Default.aspx.cs" oder "Default.aspx.vb" einen Ereignishandler zu erstellen.

  2. Fügen Sie oben in der Datei (vor der Klassendeklaration) die Anweisung Imports (Visual Basic) oder using (Visual C#) hinzu.

    [Visual Basic]

    Imports System.Runtime.Caching
    Imports System.IO
    

    [C#]

    using System.Runtime.Caching;
    using System.IO;
    
  3. Fügen Sie im Ereignishandler den folgenden Code hinzu, um den Cache zu instanziieren.

    [Visual Basic]

    Dim cache As ObjectCache = MemoryCache.Default
    

    [C#]

    ObjectCache cache = MemoryCache.Default;
    

    Der ObjectCache ist eine Basisklasse, die Methoden zum Implementieren eines Cacheobjekts im Arbeitsspeicher bereitstellt.

    Hinweis

    In ASP.NET 4 wird das Zwischenspeichern mit der ObjectCache-Klasse implementiert.

  4. Fügen Sie den folgenden Code hinzu, um den Inhalt eines Cacheeintrags mit dem Namen filecontents zu lesen.

    [Visual Basic]

    Dim fileContents As String = TryCast(cache("filecontents"), String)
    

    [C#]

    string fileContents = cache["filecontents"] as string;
    
  5. Fügen Sie den folgenden Code hinzu, um zu überprüfen, ob der Cacheeintrag mit dem Namen filecontents vorhanden ist.

    [Visual Basic]

    If fileContents Is Nothing Then
    
    End If
    

    [C#]

    if (fileContents == null)
    {
    
    }
    

    Wenn der angegebene Cacheeintrag nicht vorhanden ist, müssen Sie die Textdatei lesen und sie dem Cache als Cacheeintrag hinzufügen.

  6. Fügen Sie im if/then-Block den folgenden Code hinzu, um ein neues CacheItemPolicy-Objekt zu erstellen, das angibt, dass der Cache nach 10 Sekunden abläuft.

    [Visual Basic]

    Dim policy As New CacheItemPolicy()
    policy.AbsoluteExpiration = DateTimeOffset.Now.AddSeconds(10.0)
    

    [C#]

    CacheItemPolicy policy = new CacheItemPolicy();
    policy.AbsoluteExpiration = DateTimeOffset.Now.AddSeconds(10.0);
    

    Wenn keine Entfernungs- oder Ablaufinformationen bereitgestellt werden, ist InfiniteAbsoluteExpiration die Standardeinstellung. Das bedeutet, dass Elemente im Cache nicht basierend auf einer absoluten Zeit ablaufen. Stattdessen laufen Elemente nur ab, wenn es nicht genügenden Arbeitsspeicher gibt. Als Best Practice sollten Sie immer explizit entweder einen absoluten oder variablen Ablauf bereitstellen. In dieser exemplarischen Vorgehensweise verwenden Sie einen absoluten Ablauf von 10 Sekunden.

  7. Im if/then-Block fügen Sie den folgenden Code nach dem im vorherigen Schritt hinzugefügten Code hinzu, um eine Auflistung für die zu überwachenden Dateipfade zu erstellen und den Pfad der Textdatei zur Auflistung hinzufügen.

    [Visual Basic]

    Dim filePaths As New List(Of String)()
    Dim cachedFilePath As String = Server.MapPath("~") & _
            "\cacheText.txt"
    filePaths.Add(cachedFilePath)
    

    [C#]

    List<string> filePaths = new List<string>();
    string cachedFilePath = Server.MapPath("~") + "\\cacheText.txt";
    filePaths.Add(cachedFilePath);
    

    Die HttpServerUtilityMapPath()-Methode gibt den Pfad an den Stamm der aktuellen Website zurück.

  8. Fügen Sie nach dem im vorherigen Schritt hinzugefügten Code den folgenden Code hinzu, um ein neues HostFileChangeMonitor-Objekt für die Auflistung von Änderungsüberwachungen hinzuzufügen.

    [Visual Basic]

    policy.ChangeMonitors.Add(New HostFileChangeMonitor(filePaths))
    

    [C#]

    policy.ChangeMonitors.Add(new HostFileChangeMonitor(filePaths));
    

Das HostFileChangeMonitor-Objekt überwacht den Pfad der Textdatei und benachrichtigt den Cache, wenn Änderungen auftreten. In diesem Beispiel läuft der Cacheeintrag automatisch ab, wenn sich der Inhalt der Datei ändert.

  1. Fügen Sie nach dem im vorherigen Schritt hinzugefügten Code den folgenden Code hinzu, um den Inhalt der Textdatei zu lesen.

    fileContents = File.ReadAllText(cachedFilePath) & vbCrLf & DateTime.Now.ToString()
    
    fileContents = File.ReadAllText(cachedFilePath) + "\n" + DateTime.Now; 
    

    Datums- und Zeitstempel werden hinzugefügt, damit Sie besser feststellen können, wann der Cacheeintrag abläuft.

  2. Fügen Sie nach dem im vorherigen Schritt hinzugefügten Code den folgenden Code hinzu, um den Inhalt der Datei in das Cacheobjekt als CacheItem-Instanz einzufügen.

    [Visual Basic]

    cache.Set("filecontents", fileContents, policy)
    

    [C#]

    cache.Set("filecontents", fileContents, policy);
    

    Sie können Informationen darüber angeben, wie der Cacheeintrag entfernt werden soll, indem Sie das CacheItemPolicy-Objekt als Parameter der Set-Methode übergeben.

  3. Fügen Sie nach dem if/then-Block den folgenden Code hinzu, um den zwischengespeicherten Dateiinhalt in einem Label-Steuerelement anzuzeigen.

    [Visual Basic]

    Label1.Text = fileContents
    

    [C#]

    Label1.Text = fileContents;
    

Testen der Zwischenspeicherung auf der ASP.NET-Website

Sie können die Anwendung jetzt testen.

So testen Sie das Zwischenspeichern auf der ASP.NET-Website

  1. Drücken Sie STRG+F5, um die Anwendung auszuführen.

  2. Klicken Sie auf Aus Cache abrufen.

    Der zwischengespeicherte Inhalt in der Textdatei wird in der Bezeichnung angezeigt. Beachten Sie den Zeitstempel am Ende der Datei.

  3. Klicken Sie erneut auf Aus Cache abrufen.

    Der Zeitstempel ist unverändert. Das bedeutet, dass der zwischengespeicherte Inhalt angezeigt wird.

  4. Warten Sie 10 Sekunden oder länger, und klicken Sie dann erneut auf Aus Cache abrufen.

    Dieses Mal wird ein neuer Zeitstempel angezeigt. Das bedeutet, dass der Cache aufgrund der Richtlinie nach 10 Sekunden abgelaufen ist und dass neuer zwischengespeicherter Inhalt angezeigt wird.

  5. Öffnen Sie die Textdatei, die Sie dem Websiteprojekt hinzugefügt haben, in einem Text-Editor. Nehmen Sie noch keine Änderungen vor.

  6. Klicken Sie erneut auf Aus Cache abrufen.

    Beachten Sie wieder den Zeitstempel.

  7. Nehmen Sie eine Änderung an der Textdatei vor, und speichern Sie dann die Datei.

  8. Klicken Sie erneut auf Aus Cache abrufen.

    Dieses Mal ändert sich der Zeitstempel sofort. Das bedeutet, dass die Hostdatei-Änderungsüberwachung das Cacheelement sofort entfernt hat, als Sie eine Änderung vorgenommen haben.

    Hinweis

    Sie können die Entfernungszeit auf 20 Sekunden oder mehr erhöhen, damit Sie mehr Zeit haben, um in der Datei eine Änderung vornehmen.

Codebeispiel

Nachdem Sie diese exemplarische Vorgehensweise abgeschlossen haben, entspricht der Code für die von Ihnen erstellte Website dem folgenden Beispiel.

Imports System.Runtime.Caching
Imports System.IO

Partial Class _Default
    Inherits System.Web.UI.Page

    Protected Sub Button1_Click(ByVal sender As Object, _
            ByVal e As System.EventArgs) Handles Button1.Click
        Dim cache As ObjectCache = MemoryCache.Default
        Dim fileContents As String = TryCast(cache("filecontents"), _
            String)
        If fileContents Is Nothing Then
            Dim policy As New CacheItemPolicy()
            policy.AbsoluteExpiration = _
                DateTimeOffset.Now.AddSeconds(10.0)
            Dim filePaths As New List(Of String)()
            Dim cachedFilePath As String = Server.MapPath("~") & _
                "\cacheText.txt"
            filePaths.Add(cachedFilePath)
            policy.ChangeMonitors.Add(New  _
                HostFileChangeMonitor(filePaths))

            ' Fetch the file contents.
            fileContents = File.ReadAllText(cachedFilePath) & _
                vbCrLf & DateTime.Now.ToString()
            cache.Set("filecontents", fileContents, policy)
        End If
        Label1.Text = fileContents
    End Sub

End Class
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Runtime.Caching;
using System.IO;

public partial class _Default : System.Web.UI.Page
{


    protected void Button1_Click1(object sender, EventArgs e)
    {
        ObjectCache cache = MemoryCache.Default;
        string fileContents = cache["filecontents"] as string;

        if (fileContents == null)
        {
            CacheItemPolicy policy = new CacheItemPolicy();
            policy.AbsoluteExpiration =
                DateTimeOffset.Now.AddSeconds(10.0);

            List<string> filePaths = new List<string>();
            string cachedFilePath = Server.MapPath("~") +
                "\\cacheText.txt";

            filePaths.Add(cachedFilePath);

            policy.ChangeMonitors.Add(new
                HostFileChangeMonitor(filePaths));

            // Fetch the file contents.
            fileContents = File.ReadAllText(cachedFilePath) + "\n"
                + DateTime.Now.ToString();

            cache.Set("filecontents", fileContents, policy);

        }

        Label1.Text = fileContents;
    }
}

Nächste Schritte

In ASP.NET können Sie mehrere Cacheimplementierungen zum Zwischenspeichern von Daten verwenden. Weitere Informationen finden Sie unter Caching Application Data by Using Multiple Cache Objects in an ASP.NET Application.

Siehe auch

Referenz

MemoryCache

ObjectCache

Konzepte

Caching in .NET Framework-Anwendungen