Inhalt
Vorwort
1 Wie .NET und ASP.NET funktionieren
2 Installation
3 Hinweise zu VB.NET
4 »Hallo, Welt!« – Ein ASP.NET-Crashkurs
5 Die Page-Klasse
6 HTML-Serversteuerelemente
7 Validierung von Anwendereingaben
8 Webserversteuerelemente
9 Webserversteuerelemente für die Darstellung von Listen
10 Webserversteuerelemente selbst erstellen
11 Der Status von Seiten, Sitzungen und Applikationen
12 ASP.NET und Datenbanken
13 »Wer darf was?« ASP.NET und Sicherheit
14 Webanwendungen erstellen und konfigurieren
15 Leistungssteigerung durch Caching
16 Web Services
A Anhang
Index
Download (ca 14,3 MB)
Buch bestellen (29,90 EUR)
Ihre Meinung?@
<< zurück | Galileo Computing / <openbook> / Einstieg in ASP.NET | vor >>
Einstieg in ASP.NET von Matthias Lohrer
| Kapitel 14 Webanwendungen erstellen und konfigurieren
|  | 14.1 Eine Webanwendung neu erstellen
|  |  | 14.1.1 Ein physikalisches Verzeichnis festlegen
|  |  | 14.1.2 Eine Start-Datei erstellen
|  |  | 14.1.3 Ein virtuelles Verzeichnis definieren
|  |  | 14.1.4 Die Startseite festlegen
|  | 14.2 Die Webanwendung mit global.asax konfigurieren
|  |  | 14.2.1 Direktiven
|  |  | 14.2.2 Der Skriptblock
|  |  | 14.2.3 Server Side Includes
|  |  | 14.2.4 Objektdeklarationen
|  |  | 14.2.5 Die Klasse HttpApplication
|  |  | 14.2.6 Eine Webanwendung starten/beenden/neu starten
|  | 14.3 Die Konfigurationskaskade mit machine.config und web.config
|  |  | 14.3.1 Konfiguration von virtuellen und von physikalischen Verzeichnissen
|  |  | 14.3.2 Das Format von web.config
|  |  | 14.3.3 Der Aufbau von web.config
|  |  | 14.3.4 Konfigurationsabschnitte
|  |  | 14.3.5 Eigene Konfigurationen erstellen
|  |  | 14.3.6 Vorteile der hierarchischen Konfiguration
## 14.2 Die Webanwendung mit global.asax konfigurieren 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
| Direktiven,
| einen Skriptblock,
| Server Side Includes und
| Objektdeklarationen.
Die Reihenfolge dieser Abschnitte ist gleichgültig. Die Abschnitte können auch mehrfach auftreten. ### 14.2.1 Direktiven #### 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:
| E System
| E System.Collections
| E System.Collections.Specialized
| E System.Configuration
| E System.IO
| E System.Text
| E System.Text.RegularExpressions
| E System.Web
| E System.Web.Caching
| E System.Web.Security
| E System.Web.SessionState
| E System.Web.UI
| E System.Web.UI.HtmlControls
| 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. ### 14.2.2 Der Skriptblock 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:
| BeginRequest Eine Seitenanforderung trifft ein.
| AuthenticateRequest Ermöglicht die Einrichtung individueller Sicherheitsroutinen für die Authentifizierung.
| AuthorizeRequest Ermöglicht die Einrichtung individueller Sicherheitsroutinen für die Autorisierung.
| 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).
| AcquireRequestState Der Sitzungsstatus ist erreicht.
| PreRequestHandlerExecute Tritt ein, bevor ASP.NET mit der Ausführung einer Seite oder eines Services beginnt.
Der Handler wird ausgeführt.
| PostRequestHandlerExecute Tritt ein, nachdem der ASP.NET-Handler die Ausführung der Seite oder des Services abgeschlossen hat.
| ReleaseRequestState Die Daten des Sitzungsstatus werden gespeichert.
Die Ausgabe wird gegebenenfalls von Antwortfiltern gefiltert.
| UpdateRequestCache Tritt ein, wenn Cache-Module die Antwort speichern.
| EndRequest. Das ist das Signal, dass der Request fertig abgearbeitet wurde.
| PreSendRequestHeaders Tritt ein, bevor der HTTP-Header an den Client gesendet wird.
| 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. 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")
       ...
### 14.2.3 Server Side Includes 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. ### 14.2.4 Objektdeklarationen 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. ### 14.2.5 Die Klasse HttpApplication 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 ### 14.2.6 Eine Webanwendung starten/beenden/neu starten #### 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.
<< zurück | <top> | vor >>
Zum Katalog
Einstieg in ASP.NET bestellen
Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen? Ihre Meinung

.NET-Bibliothek
| Einstieg in VB.NET
| VB.NET
| Einstieg in C#
| Visual C#
| VB.NET und Datenbanken

Empfehlung
| Einstieg in XML

Shopping
Versandkostenfrei bestellen in Deutschland und Österreich Info

MyGalileo
Der Service für registrierte Leser: Info

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