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