Galileo Computing < openbook >
Galileo Computing - Programming the Net
Galileo Computing - Programming the Net


Einstieg in ASP.NET von Matthias Lohrer
Einstieg in ASP.NET
gp Kapitel 11 Der Status von Seiten, Sitzungen und Applikationen
  gp 11.1 Versteckte Felder in Formularen nutzen
  gp 11.2 Der Status einer Seite: Viewstate
    gp 11.2.1 Eigene Daten im Viewstate speichern
    gp 11.2.2 Den Anzeigestatus ein- und ausschalten
  gp 11.3 Der Status einer Sitzung: Session
    gp 11.3.1 Die Klasse HttpSessionState
    gp 11.3.2 Wie ASP.NET die Probleme des klassischen ASP löst
    gp 11.3.3 Übertragung der Session-ID: Cookie oder URL
    gp 11.3.4 Den Sitzungsstatus ein- und ausschalten
    gp 11.3.5 Den Sitzungsstatus konfigurieren
    gp 11.3.6 Session-Ereignisse verwenden
    gp 11.3.7 Objekte mit Session-Scope einbinden
    gp 11.3.8 Instanzen eigener Klassen in den Sitzungsdaten speichern
  gp 11.4 Cookies verwenden
  gp 11.5 Der Status einer Anwendung: Application
    gp 11.5.1 Den Zugriff auf anwendungsweite Daten synchronisieren
    gp 11.5.2 Beschränkungen von Application-Variablen


Galileo Computing

11.5 Der Status einer Anwendung: Application  downtop

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.


Galileo Computing

11.5.1 Den Zugriff auf anwendungsweite Daten synchronisieren  downtop

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.


Galileo Computing

11.5.2 Beschränkungen von Application-Variablen  toptop

Abgesehen davon, dass sie wertvollen Hauptspeicher belegen, müssen Sie bei der Verwendung von Application-Variablen folgende Einschränkungen berücksichtigen:

gp  Application-Variablen werden nicht persistent gespeichert. Wenn der Webserver neu gestartet wird oder abstürzt, sind die Daten verloren.
gp  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.
  

Einstieg in VB.NET

VB.NET

Einstieg in C#

Visual C#

VB.NET und Datenbanken

Einstieg in XML




Copyright © Galileo Press GmbH 2003
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Galileo Computing]

Galileo Press GmbH, Gartenstraße 24, 53229 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de