Übersicht über den ASP.NET-Anwendungszustand
Aktualisiert: November 2007
Der Anwendungszustand ist ein Datenrepository, das allen Klassen innerhalb einer ASP.NET-Anwendung zur Verfügung steht. Der Anwendungszustand wird auf dem Server im Arbeitsspeicher gespeichert und erlaubt einen schnelleren Zugriff als das Speichern und Abrufen von Informationen über eine Datenbank. Im Gegensatz zum Sitzungszustand, der für jede einzelne Benutzersitzung spezifisch ist, gilt der Anwendungszustand für alle Benutzer und Sitzungen. Daher eignet sich der Anwendungszustand insbesondere zum Speichern kleiner Mengen von Daten, die häufig verwendet werden und für alle Benutzer gleich sind. Informationen über das Speichern von Daten auf Einzelbenutzerbasis finden Sie unter Übersicht über den ASP.NET-Sitzungszustand und Übersicht über ASP.NET-Profileigenschaften.
Verwenden des Anwendungszustands
Der Anwendungszustand wird in einer Instanz der HttpApplicationState-Klasse gespeichert. Diese Klasse macht ein Schlüssel-Wert-Wörterbuch von Objekten verfügbar.
Die HttpApplicationState-Instanz wird erstellt, wenn zum ersten Mal ein Benutzer auf eine URL-Ressource in einer Anwendung zugreift. Auf die HttpApplicationState-Klasse wird am häufigsten über die Application-Eigenschaft der HttpContext-Klasse zugegriffen.
Sie können den Anwendungszustand auf zwei verschiedene Arten verwenden: Sie können der Contents-Auflistung Werte hinzufügen, auf diese Werte zugreifen und sie wieder entfernen, indem Sie Code verwenden. Auf die HttpApplicationState-Klasse kann über die gesamte Lebensdauer der Anwendung hinweg zugegriffen werden. Es ist jedoch oft hilfreich, Anwendungszustandsdaten beim Starten der Anwendung zu laden. Sie können in die Application_Start-Methode der Datei Global.asax Code zum Laden des Anwendungszustands einfügen. Weitere Informationen finden Sie unter Übersicht über den Lebenszyklus von ASP.NET-Anwendungen für IIS 5.0 und 6.0.
Alternativ können Sie der StaticObjects-Auflistung mittels einer <object >-Deklaration in der Datei Global.asax der Webanwendung Objekte hinzufügen. Auf den so definierten Anwendungszustand kann dann vom Code in der gesamten Anwendung zugegriffen werden. Im folgenden Beispiel wird eine Objektdeklaration für einen Anwendungszustandswert veranschaulicht:
<object scope="application" ID="MyInfo"
PROGID="MSWC.MYINFO">
</object>
Sie können der StaticObjects-Auflistung nur in der Datei Global.asax Objekte hinzufügen. Beim Versuch, Objekte direkt über Code hinzuzufügen, wird eine NotSupportedException ausgelöst.
Sie können auf Member von Objekten zugreifen, die im Anwendungszustand gespeichert sind, ohne auf die Application-Auflistung verweisen zu müssen. Das folgende Beispiel veranschaulicht, wie auf ein Member eines Objekts verwiesen wird, das in der StaticObjects-Auflistung definiert ist.
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
Label1.Text = MyInfo.Title
End Sub
protected void Page_Load(Object sender, EventArgs e)
Label1.Text = MyInfo.Title;
End Sub
Überlegungen zum Anwendungszustand
Wenn Sie den Anwendungszustand verwenden, müssen Sie die folgenden wichtigen Überlegungen beachten:
Ressourcen: Da der Anwendungszustand im Arbeitsspeicher gespeichert wird, ist er von der Geschwindigkeit her dem Speichern auf Datenträgern oder in Datenbanken deutlich überlegen. Das Speichern großer Datenblöcke im Anwendungszustand kann den Arbeitsspeicher des Servers jedoch schnell füllen und schließlich zu einer Auslagerung des Speichers auf die Festplatte führen. Alternativ zur Verwendung des Anwendungszustands können Sie zum Speichern großer Mengen an Anwendungsdaten den ASP.NET-Cachemechanismus verwenden. Der ASP.NET-Cache speichert Daten ebenfalls im Arbeitsspeicher und ist dadurch sehr schnell. Da ASP.NET den Cache jedoch aktiv verwaltet, werden Elemente entfernt, wenn der Arbeitsspeicher knapp wird. Weitere Informationen finden Sie unter Übersicht über das Zwischenspeichern in ASP.NET.
Flüchtigkeit: Da der Anwendungszustand im Serverarbeitsspeicher gespeichert wird, geht er jedes Mal verloren, wenn die Anwendung beendet oder neu gestartet wird. Z. B. wird die Anwendung bei Änderungen an der Datei Web.config neu gestartet. Dabei geht der gesamte Anwendungszustand verloren, wenn die Anwendungszustandswerte nicht zuvor in ein permanentes Speichermedium wie eine Datenbank geschrieben wurden.
Skalierbarkeit: Wenn dieselbe Anwendung wie in einer Webfarm auf mehreren Servern oder wie in einem Webgarten auf demselben Server, aber auf mehrere Workerprozesse verteilt, ausgeführt wird, kann der Anwendungszustand von diesen Servern bzw. Workerprozessen nicht gemeinsam verwendet werden. Deshalb können Sie bei einer verteilt ausgeführten Anwendung nicht davon ausgehen, dass der Anwendungszustand für die verschiedenen Server bzw. Prozesse dieselben Daten enthält. Wenn die Anwendung in einer Mehrprozessor- oder Mehrserverumgebung ausgeführt werden soll, sollten Sie für die Daten, die für die gesamte Anwendung identisch sein müssen, die Verwendung einer besser skalierbaren Option, z. B. einer Datenbank, in Betracht ziehen.
Parallelität: Der Anwendungszustand arbeitet im Freethreadmodus, was bedeutet, dass auf die Anwendungszustandsdaten durch mehrere Threads gleichzeitig zugegriffen werden kann. Deshalb müssen Sie eine Aktualisierung von Anwendungszustandsdaten unbedingt in einer threadsicheren Weise durchführen, indem Sie die integrierte Synchronisierungsunterstützung verwenden. Sie können die Lock-Methode und die UnLock-Methode verwenden, um die Daten für das Schreiben durch nur eine Quelle zu sperren und auf diese Weise die Datenintegrität sicherzustellen. Außerdem kann die Wahrscheinlichkeit von Parallelitätsproblemen durch die Initialisierung der Anwendungszustandswerte in der Application_Start-Methode der Datei Global.asax reduziert werden. Weitere Informationen finden Sie unter Übersicht über den Lebenszyklus von ASP.NET-Anwendungen für IIS 5.0 und 6.0.
Siehe auch
Aufgaben
Gewusst wie: Speichern von Werten im Anwendungszustand
Gewusst wie: Lesen von Werten im Anwendungszustand
Konzepte
Übersicht über die ASP.NET-Zustandsverwaltung