mk-prg-net \net \asp \ mvc \app-states

Zustände von Applikationen und Sitzungen

Definition
Anwendungszustand Der Anwendungszustand ist ein gemeinsamer Speicherbereich, der allen Sitzungen bereitgestellt wird. Über den Anwendungszustand ist eine Kommunikation zwischen den Sitzungen möglich.

Der Anwendungszustand ist eine Instanz der Klasse HttpApplication. Wie schon im klassischen ASP verhält sich diese wie ein Dictionary, das jede Zustandsvariable einem Zugriffsschlüssel zuordnet:

In ASP.NET MVC kann aus einer Action über die Eigenschaft HttpContext auf zwei Anwendungsobjekte vom Typ HttpApplication zugegriffen werden:

// globales Anwendungsobjekt auf dem Webserver
// Alles Sitzungen aus allen Anwendungen auf dem Webserver haben Zugriff
HttpContext.Application 

// lokal zur Anwendung (virtuelles Verzeichnis)
// Alle Sitzungen innerhalb einer Anwendungen haben Zugriff
HttpContext.ApplicationInstance

Eine Besonderheit in ASP.NET ist, das auch Klassenfelder (Felder mit dem Modifikator static in C# oder Shared in VB.NET) zum Anwendungszustand gehören. Folgende Deklaration erweitert den Anwendungszustand um eine Integervariable.

class C1 {
    public static int x;
}

Alle Sitzungen können über C1.x kommunizieren !

Ereignishandler für Applikationen und Sitzungen (Global.asax)

Die Ereignisroutinen einer Anwendung werden in der Datei Global.asax definiert.

<@ Application Language="C#" ClassName="myApp" %>
<script language="VB" runat="server">
void Application_Start(Object sender, EventArgs e) {
   // wird beim Starten der Applikation ausgeführt
}
void Session_Start(Object sender, EventArgs e) {
   // wird beim Starten der Sitzung ausgeführt
}
void Session_End(Object sender, EventArgs e) {
   // wird beim beenden einer Sitzung ausgeführt
}
void Application_End(Object sender, EventArgs e) {
   // wird beim beenden einer Anwendung ausgeführt
}
</script>

Zugriffe auf den Anwendungszustand synchronisieren

Alle Sitzungen haben Zugriff auf den Anwendungszustand. Deshalb ist eine Synchronisierung der konkuriererenden Zugriffe notwendig. Die Klasse Application bietet dazu die statischen Methoden Applikation.Lock() und Application.Unlock() an.

     void Application_Start( object sender,   EventArgs e) 
    {
         // Code, der beim Starten der Anwendung ausgeführt wird.       
        Application.Add(  "countSessions" , 0);
    }
     void Session_Start( object sender,   EventArgs e) 
    {
         // Code, der beim Starten einer neuen Sitzung ausgeführt wird.        
       
         // Auf die Tabelle im Anwendungszustand zugreifen
        Application.Lock();   // Synchronisieren des Zugriffs
        int countSessions = ( int )Application[  "countSessions" ];
        countSessions++;
        Application[  "countSessions" ] = countSessions; 
        
        Application.UnLock();
    }

Ähnlich wie der Anwendungszustand verhalten sich auch statische Variablen. Auch diese teilen sich alle Sitzungen, d.h. wird eine statische Membervariable wie folgt definiert, dann teilen sich alle Sitzungen den reservierten Speicherplatz. Auch hier ist Synchronisation erforderlich, z.B. mit Mutex- Objekten.

class MyClass {
   …
    // Alle Sitzungen haben Zugriff auf folgenden Variable. Konkurrierende Schreib-
    // und Lesezugriffe müssen synchronisiert werden !
    public static int myStatikMember = 99;
}

Definition

Sitzungsstatus

Ist eine Collection von Objekten, die den Zustand einer Sitzung widerspiegeln

Deklaration:

HttpSessionState Session;

Initialsierung von Anwendungs und Sitzungsvariablen in C#

In C# müssen Anwendungsstatusvariablen initialisiert werden, bevor Operationen auf diesen ausgeführt werden !

Vewaltung von Sitzungen

Sessions können in einer web.config- Datei zentral, oder pro Seite an oder abgeschaltet werden.

Sessions in web.config aktivieren/deaktivieren

<configuration>
  <system.web>
    <pages enableSessionState="true"/>
  </system.web>
</configuration>

Session pro Seite aktivieren/deaktivieren

<%@ Page EnableSessionState="true|false" %>

Zugriff auf Sitzungsdaten über Session- Objekt