11.5 Der Status einer Anwendung: Application
 
Informationen, Daten und Objekte, die innerhalb einer gesamten Webanwendung verfügbar sein sollen, können Sie über den Status der Applikation verfügbar machen. In der Datei global.asax können Sie unter anderem mit den Prozeduren Application_OnStart und Application_OnEnd auf den Start und das Ende einer Anwendung reagieren. Eine Webanwendung startet, wenn die erste Seite aufgerufen wird. Wenn eine zentrale Konfigurationsdatei wie global.asax oder web.config verändert wurde, wird die Webanwendung beendet und neu gestartet.
In der Prozedur Application_OnStart können Sie grundlegende Daten initialisieren, auf die Sie innerhalb der gesamten Applikation zugreifen müssen.
Kapitel 14, Webanwendungen erstellen und konfigurieren, erläutert den Aufbau und die Verwendung der Datei global.asax ausführlich. An dieser Stelle sollen lediglich einige Grundlagen vorgestellt werden.
11.5.1 Den Zugriff auf anwendungsweite Daten synchronisieren
 
Wenn Sie Variablen, die in der Datei global.asax angelegt werden, nicht nur auslesen, sondern innerhalb Ihrer Anwendung auch bearbeiten, dann müssen Sie den Zugriff auf diese anwendungsweiten Daten synchronisieren.
Das zugrunde liegende Problem lässt sich am besten an einem Beispiel verdeutlichen. Angenommen, Sie möchten mit Hilfe einer Application-Variablen zählen, wie oft die Datei index01.aspx aufgerufen wurde. Hierfür stellen Sie die Application-Variable Application("indexCount") zur Verfügung. Das Szenario für Ihr Zählwerk stellen Sie sich so vor:
Anwender A greift auf index01.aspx zu. Der Code in index01.aspx liest den Wert von Application("indexCount") aus, erhöht den Wert um 1 und schreibt den erhöhten Wert zurück. Später greift Anwender B ebenfalls auf index01.aspx zu, liest den erhöhten Wert aus, erhöht ihn und schreibt ihn zurück und so weiter.
Ein Fehler tritt aber dann auf, wenn Anwender A auf index01.aspx zugreift, Application("indexCount") ausliest und dann Anwender B die Variable ausliest, noch bevor Anwender A den erhöhten Wert zurückschreiben konnte. In diesem Fall wird die Variable jeweils von x auf x+1 erhöht und x+1 wird zweimal zurückgeschrieben. Im Ergebnis wurde dabei ein Aufruf nicht gezählt.
Um diesen Fehler zu vermeiden, müssen Sie so etwas wie einen künstlichen Flaschenhals anlegen. Dafür stellt die Klasse HttpApplicationState die Methoden Lock() und UnLock() zur Verfügung. Code zwischen Lock() und UnLock() wird immer am Stück ausgeführt, so dass dieses Problem nicht mehr auftauchen kann.
| Achtung Die Methoden Lock() und UnLock() blockieren die gesamte Anwendung. Daher sollten sie nur möglichst selten benutzt werden und der Code zwischen Lock() und UnLock() sollte möglichst kurz sein
|
Der Code für dieses Beispiel könnte folgende Form haben. In global.asax initialisieren Sie in der Prozedur Application_OnStart() die Variable Application("indexCount") zunächst mit dem Wert 0.
<%@ Application Language="VB" %>
<script runat="server" >
Protected Sub Application_OnStart ()
Application("indexCount") = 0
End Sub
</script>
In index01.aspx realisieren Sie Ihr Zählwerk in der Prozedur Page_Load():
<!-- index01.aspx -->
<%@ Page Language="VB" Debug="True" Strict="True" %>
<script runat="server">
Sub Page_Load (ByVal Sender As Object, _
ByVal E As EventArgs)
Dim anzahl As Integer
Application.Lock()
anzahl = CInt(Application("indexCount"))
anzahl = anzahl + 1
Application("indexCount") = anzahl
Application.UnLock()
ausgabe.innerHTML &= CStr(Application("indexCount"))
End Sub
</script>
<html><head>
<title>Test-Web</title>
</head><body>
<h1>Test-Web</h1>
<p>Mein Test-Web</p>
<p runat="server" id="ausgabe" >Anzahl: </p>
</body></html>
Auslesen, Erhöhen und Zurückschreiben der Zählervariablen ist in Application.Lock() und Application.UnLock() eingeklammert.
Weitere Details zur Klasse HttpApplicationState enthält Kapitel 14, Webanwendungen erstellen und konfigurieren.
11.5.2 Beschränkungen von Application-Variablen
 
Abgesehen davon, dass sie wertvollen Hauptspeicher belegen, müssen Sie bei der Verwendung von Application-Variablen folgende Einschränkungen berücksichtigen:
|
Application-Variablen werden nicht persistent gespeichert. Wenn der Webserver neu gestartet wird oder abstürzt, sind die Daten verloren. |
|
Application-Variablen stehen nur im Adressraum einer Maschine zur Verfügung. Sie sind nicht für Webgärten oder Webfarmen skalierbar. Ein Webgarten verwendet mehrere Prozessoren. Eine Webfarm besteht aus mehreren, voneinander unabhängigen Maschinen. Anders gesagt: Application-Variablen sind nicht skalierbar. |
|