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 14 Webanwendungen erstellen und konfigurieren
  gp 14.1 Eine Webanwendung neu erstellen
    gp 14.1.1 Ein physikalisches Verzeichnis festlegen
    gp 14.1.2 Eine Start-Datei erstellen
    gp 14.1.3 Ein virtuelles Verzeichnis definieren
    gp 14.1.4 Die Startseite festlegen
  gp 14.2 Die Webanwendung mit global.asax konfigurieren
    gp 14.2.1 Direktiven
    gp 14.2.2 Der Skriptblock
    gp 14.2.3 Server Side Includes
    gp 14.2.4 Objektdeklarationen
    gp 14.2.5 Die Klasse HttpApplication
    gp 14.2.6 Eine Webanwendung starten/beenden/neu starten
  gp 14.3 Die Konfigurationskaskade mit machine.config und web.config
    gp 14.3.1 Konfiguration von virtuellen und von physikalischen Verzeichnissen
    gp 14.3.2 Das Format von web.config
    gp 14.3.3 Der Aufbau von web.config
    gp 14.3.4 Konfigurationsabschnitte
    gp 14.3.5 Eigene Konfigurationen erstellen
    gp 14.3.6 Vorteile der hierarchischen Konfiguration


Galileo Computing

14.2 Die Webanwendung mit global.asax konfigurieren  downtop

Mit der Datei global.asax legen Sie solche Konfigurationseinstellungen fest, die für die gesamte Webanwendung gelten. Hier können Sie Methoden, Eigenschaften und Ereignisse definieren, die global verfügbar sind. Die Datei global.asax muss im Stammverzeichnis der Webanwendung liegen. Falls eine Webanwendung nicht über eine eigene Datei global.asax verfügt, werden Standardeinstellungen verwendet.


Tipp   Die Datei global.asax liegt zwar im Stammverzeichnis der Applikation und damit an einer Stelle, die öffentlich gut zugänglich ist. Es ist aber nicht möglich, diese Datei im Browser aufzurufen.

Der Aufruf etwa von http://localhost/Testweb/global.asax im Browser erzeugt eine klare Warnmeldung:

Der angeforderte Seitentyp wird nicht verarbeitet, da er ausdrücklich verboten ist.

global.asax enthält die Definition einer Klasse. Diese Klasse stammt von der Basisklasse HttpApplication ab. Beim Start der Webanwendung erstellt die Laufzeitumgebung aus dieser Klasse ein entsprechendes Objekt.

Änderungen an der Datei global.asax betreffen die gesamte Webanwendung. Sobald Sie Änderungen an dieser Datei vornehmen, wird die Webanwendung neu gestartet. Das geschieht im Hintergrund, ohne dass die Anwender davon etwas merken.

Der Aufbau der Datei global.asax ist mit dem Aufbau von aspx-Seiten vergleichbar. In vier Abschnitten sind jeweils verschiedene Arten von Anweisungen möglich. Es gibt

gp  Direktiven,
gp  einen Skriptblock,
gp  Server Side Includes und
gp  Objektdeklarationen.

Die Reihenfolge dieser Abschnitte ist gleichgültig. Die Abschnitte können auch mehrfach auftreten.


Galileo Computing

14.2.1 Direktiven  downtop

Application-Direktive

So, wie gewöhnliche aspx-Seiten am Anfang eine Page-Direktive haben, verfügt die Datei global.asax am Anfang über die Application-Direktive. Ein Beispiel:

<%@ Application Language="VB" 
                Inherits="myApp.Global"
                Description="Meine Web-Anwendung"
                ClassName="myApp" %>

Mit dem Attribut Inherits können Sie festlegen, dass diese Applikation auf einer anderen Klasse basieren soll, die ihrerseits direkt oder indirekt von HttpApplication abgeleitet sein muss.

Mit dem Attribut ClassName geben Sie Ihrer Applikation einen Namen, über den die Anwendung erreichbar ist, z. B. für den Aufruf statischer Methoden, die Sie in global.asax definiert haben. Näheres dazu finden Sie im Abschnitt über den Skript-Block.

Import-Direktive

<%@ Import Namespace="System.Data" %>

Mit der Import-Direktive können Sie Namespaces innerhalb der gesamten Applikation sichtbar machen. Wenn Sie bestimmte Namespaces sehr oft verwenden, können Sie auf diese Weise den Schreibaufwand reduzieren. Folgende Namespaces stehen stets automatisch zur Verfügung, ohne dass Sie sie erst eigens importieren müssten:

gp  E System
gp  E System.Collections
gp  E System.Collections.Specialized
gp  E System.Configuration
gp  E System.IO
gp  E System.Text
gp  E System.Text.RegularExpressions
gp  E System.Web
gp  E System.Web.Caching
gp  E System.Web.Security
gp  E System.Web.SessionState
gp  E System.Web.UI
gp  E System.Web.UI.HtmlControls
gp  E System.Web.UI.WebControls

Assembly-Direktive

Für die Einbindung von Assemblies verwenden Sie eine von zwei möglichen Formen der Assembly-Direktive:

<%@ Assembly Name="myAssemblyName" %>

oder

<%@ Assembly Src="PfadZurAssembly.vb" %>

Geben Sie entweder den Pfad zur Assembly an oder den Namen der Assembly. Assemblies im /bin-Verzeichnis stehen automatisch zur Verfügung und müssen nicht eigens eingefügt werden. Mit der Assembly-Direktive machen Sie alle Klassen und Schnittstellen der Assembly verfügbar. Die Assembly-Direktive kann natürlich mehrfach verwendet werden.


Galileo Computing

14.2.2 Der Skriptblock   downtop

Im Skriptblock legen Sie die global gültigen Eigenschaften, Methoden und Ereignisroutinen fest. Ein typischer Skriptblock hat beispielsweise diesen Aufbau:

<script language="VB" runat="server">
   Sub Application_OnStart()
      ' wird beim Starten der Anwendung ausgeführt 
   End Sub
   Sub Session_OnStart()
      ' wird beim Starten jeder Sitzung ausgeführt
   End Sub
   Sub Session_OnEnd()
      ' wird beim Beenden jeder Sitzung ausgeführt
   End Sub
   Sub Application_OnEnd()
      ' wird beim Beenden der Anwendung ausgeführt
   End Sub
   Overrides Sub HandleError(ErrorInfo as Exception)
      ' Wie beim Auftreten eines Fehlers verfahren wird
   End Sub
</script>

Sie können in global.asax auf zahlreiche Ereignisse reagieren. Wenn ein Browser eine Seite vom Server anfordert, dann begleitet das Anwendungsobjekt diesen Vorgang mit einer Reihe von Ereignissen. Diese Ereignisse treten in folgender Reihenfolge auf:

gp  BeginRequest Eine Seitenanforderung trifft ein.
gp  AuthenticateRequest Ermöglicht die Einrichtung individueller Sicherheitsroutinen für die Authentifizierung.
gp  AuthorizeRequest Ermöglicht die Einrichtung individueller Sicherheitsroutinen für die Autorisierung.
gp  ResolveRequestCache Der Code wird ausgeführt, bevor die Anwendung entscheidet, ob der Request aus dem Cache geholt oder neu erzeugt wird. Dieser Code wird also in jedem Fall ausgeführt.

An dieser Stelle wird ein Handler erstellt (das heißt eine dem Anforderungs-URL entsprechende Seite).

gp  AcquireRequestState Der Sitzungsstatus ist erreicht.
gp  PreRequestHandlerExecute Tritt ein, bevor ASP.NET mit der Ausführung einer Seite oder eines Services beginnt.

Der Handler wird ausgeführt.

gp  PostRequestHandlerExecute Tritt ein, nachdem der ASP.NET-Handler die Ausführung der Seite oder des Services abgeschlossen hat.
gp  ReleaseRequestState Die Daten des Sitzungsstatus werden gespeichert.

Die Ausgabe wird gegebenenfalls von Antwortfiltern gefiltert.

gp  UpdateRequestCache Tritt ein, wenn Cache-Module die Antwort speichern.
gp  EndRequest. Das ist das Signal, dass der Request fertig abgearbeitet wurde.
gp  PreSendRequestHeaders Tritt ein, bevor der HTTP-Header an den Client gesendet wird.
gp  PreSendRequestContent Tritt ein, bevor der Inhalt an den Client gesendet wird.

Das Error-Ereignis

Von allgemeinem Interesse dürfte schließlich noch das Ereignis Error sein. Wenn Sie in global.asax eine entsprechende Ereignisprozedur definieren, können Sie innerhalb der gesamten Anwendung einheitlich auf Fehler reagieren und beispielsweise jeweils eine Standardseite für Fehlermeldungen aufrufen. Die Prozedur Application_Error könnte beispielsweise diese Form haben:

Protected Sub Application_Error _
                   (ByVal Sender As Object, _
                    ByVal e As EventArgs )
   Dim strErr As String
   strErr = Server.GetLastError().Message.ToString()
   Context.ClearError()
   Response.Redirect ("myErrorPage.aspx?myErr=" & _
                      Server.UrlEncode (strErr))                       
End Sub    

Mit Server.GetLastError erreichen Sie den zuletzt aufgetretenen Fehler. Dessen Message speichern Sie in einer Variablen. Mit Context.ClearError() löschen Sie den Fehler der aktuellen Anforderung. Anschließend leiten Sie die Ausgabe auf Ihre selbst definierte Fehlerseite um. Die Fehlermeldung selbst fügen Sie an den URL an, wobei Sie die Meldung mit Server.UrlEncode zunächst in die URL-Form transformieren müssen.

Hier ein Beispiel für die Seite myErrorPage.aspx:

<!-- myErrorPage.aspx -->
<%@ Page Language="VB" Strict="True" Debug="True" %>
<script runat="server">
Sub Page_Load (ByVal Sender As Object, _ 
               ByVal E As EventArgs) 
   lblMeldung.Text = _
        Server.HtmlEncode(Request.QueryString("myErr"))
End Sub
</script>
<html>
<head>
<title>Fehler</title>
</head>
<body>
<h1>Fehler</h1>

<asp:Label id="lblMeldung" runat="server" />
</body>
</html>

Die Seite zeigt die übertragene Fehlermeldung an. Der Ausdruck Request.QueryString("myErr") schneidet die gesuchte Meldung aus dem URL heraus. Da die Fehlermeldung beispielsweise Hinweise auf fehlerhafte HTML-Tags enthalten kann, sorgen Sie mit Server.HtmlEncode dafür, dass solche Textbestandteile sicher zitiert und nicht versehentlich interpretiert werden.

Abbildung 14.8 zeigt beispielhaft die Fehlermeldung, wenn in der Seite index.aspx in einem asp:Label-Tag das schließende Tag fehlt.

Abbildung
Hier klicken, um das Bild zu Vergrößern

Abbildung 14.8 In global.asax können Sie eine für die ganze Anwendung einheitliche Behandlung von Fehlern festlegen.


Achtung   Die Seite für die Standard-Fehlermeldung muss selbst unbedingt fehlerfrei sein. Sie erzeugen sonst eine Endlosschleife.

Auf statische Variablen zugreifen, die in global.asax definiert werden

Wenn Sie in global.asax Eigenschaften oder Methoden definieren, müssen Sie der Anwendung selbst in der Application-Direktive mit dem Attribut ClassName einen Namen geben. Ein Beispiel: global.asax wird von dieser Direktive eingeleitet:

<%@ Application Language="VB" ClassName="myApp" %>

Im Skript-Abschnitt von global.asax speichern Sie die Versionsnummer Ihrer Applikation in einer statischen (Shared) Variablen:

Public Shared versionsnummer As String = "1.01"

In sämtlichen Seiten Ihrer Anwendung haben Sie dann über myApp.versionsnummer direkten Zugriff auf die aktuelle Versionsnummer. Beim Aufruf statischer Variablen oder Methoden ist es nicht nötig, myApp vorher erst zu deklarieren.

Eine Instanz von myApp benötigen Sie jedoch dann, wenn Sie eine Methode aufrufen möchten, die in global.asax definiert ist und die nicht als statisch markiert ist. Wieder ein Beispiel:

Im Skript-Abschnitt von global.asax definieren Sie eine Methode für das Schreiben einer Logdatei, etwa so:

   Public schreibeLog (inLogText As String) 
      ' ...
   End Sub

Wenn Sie diese Methode aus einer aspx-Seite heraus aufrufen wollen, müssen Sie über eine entsprechende Objektvariable verfügen. In der aspx-Seite schreiben Sie also:

   Dim a As New myApp
   a.schreibeLog ("ML was here")
   ...

Galileo Computing

14.2.3 Server Side Includes  downtop

Mit Hilfe von Server Side Includes können Sie den Inhalt von Dateien in global.asax importieren. Die Verwendung von Include-Dateien erleichtert beispielsweise die Wiederverwendung von Code in mehreren Webanwendungen. Die CLR überwacht auch diese Include-Dateien. Sobald eine von ihnen geändert wird, startet die CLR die Webanwendung neu. Der Code der Include-Dateien wird in global.asax eingefügt, bevor global.asax interpretiert wird.

Mit dem Attribut File geben Sie einen fixen Pfad an, der sich relativ auf die Position von global.asax bezieht. Die Include-Datei kann in untergeordneten Verzeichnissen liegen. Sie kann bei der Verwendung des Attributs File aber nicht über dem Verzeichnis liegen, in dem sich global.asax befindet. Wenn die einzufügende Datei myInclude.vb beispielsweise im gleichen Verzeichnis wie global.asax liegt, lautet die Anweisung:

<!--#Include File="myInclude.vb" -->

Wenn die Include-Datei im Verzeichnis inc unterhalb von global.asax liegt, lautet die Anweisung:

<!--#Include File="inc/myInclude.vb" -->

Vor die Pfadangabe kommt kein führender Schrägstrich.

Mit dem Attribut Virtual bezieht sich die Pfadangabe auf ein virtuelles Verzeichnis. Wenn die Include-Datei z. B. im virtuellen Verzeichnis /scripts liegt, lautet die Anweisung:

<!--#Include Virtual="/scripts/myInclude.vb" -->

Da innerhalb von global.asax nur eine Sprache, z. B. nur VB.NET oder nur C#, erlaubt ist, muss auch der Code aller Include-Dateien in dieser Sprache gefasst sein. Der Code der Include-Datei muss in ein <script>-Tag eingefasst sein, hat also diese Form:

<script runat="server" >
Sub x()
   ' ...
End Sub
'...
</script>

global.asax kann problemlos mehrere Skript-Abschnitte enthalten, die jeweils für sich mit <script > ... </script> gekennzeichnet sind.


Galileo Computing

14.2.4 Objektdeklarationen  downtop

Mit Objektdeklaration können Sie statische Objekte definieren, die entweder innerhalb der gesamten Applikation oder für jede Sitzung einmal zur Verfügung gestellt werden. Wenn Sie in der gesamten Applikation beispielsweise auf ein StringBuilder-Objekt zugreifen möchten, verwenden Sie diese Deklaration:

<object id="stringForAll" 
        runat="server"
        scope="Application"
        class="System.Text.StringBuilder" />

Anschließend können Sie aus jeder aspx-Seite ohne vorhergehende Deklaration auf das stringForAll-Objekt zugreifen.

stringForAll.Append ("Da bin ich.")

Im Attribut scope geben Sie den Gültigkeitsbereich an. Mögliche Werte sind application, session und pipeline. Wenn Sie den Wert session einsetzen, erhält jede Sitzung ihr eigenes Objekt. Beachten Sie, dass Sie dadurch unter Umständen erhebliche Ressourcen binden.

Mit dem Attribut class geben Sie den Namen einer .NET-Klasse an. Alternativ können Sie auch COM-Komponenten einbinden. Dazu verwenden Sie entweder das Attribut progID oder classID. progID nennt den programmatischen Bezeichner der Komponente. classID nennt den Klassenbezeichner. Sie können in jeder Objektdeklaration nur eines der Attribute class, progID und classID verwenden.


Galileo Computing

14.2.5 Die Klasse HttpApplication  downtop

So wie eine aspx-Seite die Definition einer Page-Klasse enthält, definiert die Datei global.asax eine Klasse vom Typ HttpApplication. Beim Start der Webanwendung erzeugt die CLR ein HttpApplication-Objekt, das sämtliche Anfragen an den Server bearbeitet. Tabelle 14.1 listet die Eigenschaften der Klasse HttpApplication auf.


Name Typ Beschreibung
Application HttpApplicationState Informationen über den Zustand der aktuellen Anforderung mit einer Auflistung aller Dateien, Seiten, Handler und Module
Context HttpContext HTTP-spezifische Informationen über die aktuelle Instanz der Anwendung
Modules HttpModuleCollection Auflistung der Module für die aktuelle Anwendung
Request HttpRequest Die verarbeitete Anforderung
Response HttpResponse Die verarbeitete Antwort
Server HttpServerUtility Das Server-Objekt für die aktuelle Anforderung
Session HttpSessionState Das Objekt für die aktuelle Sitzung
Site IComponent Eine ISite, mit der ein Container seine untergeordneten Komponenten verwalten und mit diesen kommunizieren kann
User IPrincipal Der aktuell authentifizierte bzw. anonyme Benutzer

Tabelle 14.1 Eigenschaften der Klasse HttpApplication


Galileo Computing

14.2.6 Eine Webanwendung starten/beenden/neu starten  toptop

Starten

Eine Webanwendung startet, wenn die erste Seite angefordert wird. Beim Start werden sämtliche aspx-Seiten kompiliert. Daher kann der erste Aufruf ziemlich lange dauern. Alle folgenden Aufrufe gehen erheblich schneller, weil dann alle Seiten bereits in kompilierter Form vorliegen.

Beenden und neu starten

Eine Webanwendung wird automatisch beendet und neu gestartet, wenn die Datei global.asax oder web.config verändert wurde.

  

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