Inhaltsverzeichnis         

4 Prozesse in einer ASP.NET Anwendung

4.1 WebForm- Architektur




4.2 Lebenszyklus einer WebForm

Das grundlegende Arbeitsprinzip eines Webservers ist der Request-Response Zyklus. Dabei fordert der Browser über das HTTP- Protokoll eine Webseite vom Server an, un dieser liefert als Antwort die Webseite zurück, falls sie im Zugriff des Webservers sich befindet.




Definition

PostBack

Ist ein HTTP- Request, bei dem die Eingaben in ein Formular mitgesendet werden.

4.3 Objekte im Leben einer Webanwendung




4.4 Ereignismodell einer ASP.NET Anwendung

Ein wesentliches Merkmal von ASP.NET ist die Abbildung des Request/Response Zyklus auf ein ereignisgesteuertes Programmiermodell. Dabei werden zu bestimmten Zeitpunkten innerhalb des Seitenaufbaus Ereignisse ausgelöst, für die der Programmierer Ereignishandler registrieren, und so den Aufbau der Seite beeinflussen kann. Für Request, die durch Klicks auf Formularelemente im Browser ausgelöst wurden, werden beim Seitenaufbau ebenfalls Ereignisse ausgelößt, so daß Programmieren in ASP.NET große Ähnlichkeit mit der Programmierung einer Windows- Forms Anwendung erhält.

4.4.1 Binden von Ereignissen des Seitenaufbaus an Eventhandler




Wird in der <%@ Page ...> Direktive das Attribut AutoEventWireup="true" gesetzt, dann interpretiert der Compiler Methoden, die dem Namensschema Page_Ereignisname entsprechen als Ereignishandler, und bindet sie an die entsprechde Ereignisse.

Ist AutoEventWireup="false",dann müssen die Ereignisse des Seitenaufbaus manuell an die entsprechenden Eventhandler gebunden werden.

4.4.2 Binden von Steuerelementereignissen an Eventhandler

Steuerelemente, die in der *.aspx Datei durch Markup deklariert werden, werden an Eventhandler durch OnEreignisname="Name_des_Ereignishandlers" gebunden.

Für dynamisch erstellte Steuerelemente erfolgt die Bindung durch

  Steuerelementobjekt.Event += DelegateEvent(Eventhandler)

4.5 Die Page Instanz pro HTTP Request

Pro Request einer WebForm aus einer ASP.NET Webanwendung wird aus einer von System.Web.UI.Page abgeleiteten Klasse ein Objekt instanziiert. Dieses verpackt in der Eigenschaft Request alle Details des HTTP- Requests. Über die Eigenschaft Response kann die Ausgabe an den Browser direkt manipuliert werden. Weiter können in dem Objekt eine Menge von Eventhandlern bereitgestellt werden für Ereignisse, die Steuerelemente auf der Clientseite ausgelöst haben. Damit wird die Programmierung von WebForms ähnlich der von WindowsForms.




4.5.1 Page.Request

Die ASP.NET Laufzeit verpackt die HTTP- Anfrage von einem Webbrowser in eine Instanz der Klasse HttpRequest.




4.5.1.1 QueryString und Uri

Der Querystring liefert eine gesplittete Uri, die der Request des Browsers abgesendet hat. Die Uri wird in Wikipedia (http://de.wikipedia.org/wiki/Uniform_Resource_Identifier) erläutert.

4.5.2 Page.Response

Die Ausgabe an einen Webbrowser wird über eine Instanz der Klasse HttpResponse gesteuert:




4.5.3 Abbildung des Request/Response Zyklus auf eine Kette von Ereignissen




Genaue Infos finden Sie unter
ms-help://MS.NETFrameworkSDK.DE/cpguidenf/html/cpconcontrolexecutionlifecycle.htm

4.5.4 Page_Init

Bei einem Request werden mehrere Ereignisse ausgelößt, auf die durch die Ereignishandler eines Page- Objektes reagiert wird.

Das erste Ereignis bei einem Request ist Init. Im Ereignishandler Page_Init werden Serversteuerelemente instanziiert, und mit den Benutzereingaben aus dem aus dem Request initialisiert.

4.5.5 Kontrollfluss in der Page_Load- Routine

Das Page- Objekt einer ASP.NET- Seite besitzt einen Eventhandler, die Prozedur Page_Load(ByVal sender as Object, ByVal e as EventArgs). Diese wird vom Programmierer überschrieben. In ihr erfolgt die Verarbeitung der Benutzereingaben eines Requests, und als Antwort wird das Dom der Seite modifiziert oder neu aufgebaut.

4.5.6 Anzeigestatus (Viewstate)

Ähnlich wie der Zustand einer Sitzung definiert der Anzeigestatus den Zustand einer WebForm. Die Zustandsdaten werden in einem versteckten kodierten Feld abgelgt. Primär dient der Viewstate dazu, die Inhalte von Steuerelementen über die Request- Zyklen hin zu erhalten. Eigene Zustandsvariablen könne jedoch hinzugefügt werden.

  
    if
     (ViewState["anz-req"] == 
    null
    ) 
  
   ViewState["anz-req"] = 0;                    
int wert = Convert.ToInt32(ViewState["anz-req"]);
ViewState["anz-req"] = ++wert;

Jedes Steuerelement verfügt über die Eigenschaft enableViewState. Wird ihr der Wert false zugewiesen, dann erfolgt keine Speicherung des Steuerelementeinhaltes in ViewState. So kann das Transfervolumen eines Request/Response- Zyklus gemindert werden (insbesondere bei Berechneten Feldern sollte der ViewState abgeschaltet werden).

4.6 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:




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 !

4.6.1 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>

4.6.2 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;

4.6.3 Initialsierung von Anwendungs und Sitzungsvariablen in C#

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

4.7 Vewaltung von Sitzungen

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

4.7.1.1 Sessions in web.config aktivieren/deaktivieren

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

4.7.1.2 Session pro Seite aktivieren/deaktivieren

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

4.7.2 Zugriff auf Sitzungsdaten über Session- Objekt