![]() |
|
|||||
Tabelle 14.2 Konfigurationsabschnitte im Abschnitt web.config 14.3.4 Konfigurationsabschnitte
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Tipp Mit mode="RemoteOnly" zeigt der Server die individuelle Fehlerbehandlung nur gegenüber remote-Aufrufen an, jedoch nicht bei einem lokalen Aufruf von localhost. Das erleichtert das Debugging, weil lokal die aussagekräftigeren ASP.NET-Fehlermeldungen angezeigt werden. |
Für einzelne Fehler können Sie mit dem error-Element außerdem spezielle Fehlerseiten vorsehen. Im Attribut statusCode geben Sie die Fehlernummer an, auf die reagiert werden soll, und im Attribut redirect die anzuzeigende Seite. Ein Beispiel:
<system.web>
<customErrors mode="On" defaultRedirect="error.aspx">
<error statusCode="404" redirect="error404.aspx"/>
</customErrors>
</system.web>
Wenn eine aspx-Seite nicht gefunden werden kann, tritt der Fehler 404 auf. In diesem Fall wird die Seite error404.aspx angezeigt. Bei allen anderen Fehlern wird die Seite error.aspx angezeigt.
ASP.NET übergibt den virtuellen Pfad der Datei, die den Fehler ausgelöst hat, an Ihre selbst definierte Fehlerseite mit dem Parameter aspxerrorpath. Wenn beispielsweise die Seite hh.aspx nicht gefunden werden konnte, lautet der vollständige URL für die Anzeige der Fehlermeldung:
http://localhost/Testweb/error404.aspx?aspxerrorpath=/Testweb/hh.aspx
Auf diese Weise steht Ihnen innerhalb Ihrer selbst definierten Fehlerbehandlungsseite der Name der fehlerhaften Seite zur Verfügung. error404.aspx könnte beispielsweise diesen Code enthalten:
<h1>Seite nicht gefunden</h1>
<% = Request.QueryString("aspxerrorpath") %>
konnte nicht gefunden werden.
| Achtung Diese Fehlerbehandlung wird nur für aspx-Seiten ausgeführt. Wenn eine .htm-Seite nicht gefunden werden kann, reagiert direkt der Webserver, weil in diesem Fall ASP.NET gar nicht erst in Aktion tritt. Um eine einheitliche Fehlerbehandlung zu erreichen, könnten Sie beispielsweise ausschließlich aspx-Seiten verwenden. |
<pages buffer="true|false"
enableSessionState="true|false|ReadOnly"
enableViewState="true|false"
enableViewStateMac="true|false"
autoEventWireup="true|false"
smartNavigation="true|false"
pageBaseType="typename, assembly"
userControlBaseType="typename" />
Im pages-Abschnitt geben Sie seitenspezifische Konfigurationseinstellungen an. buffer schaltet die Antwortpufferung ein oder aus. enableSessionState kann den Sitzungsstatus einschalten, ausschalten oder auf Nur Lesen einstellen. enableViewState steuert, ob der Viewstate ein- oder ausgeschaltet ist. Bei dem Attribut enableViewStateMac steht das Mac für Machine Authentication Check. Standardmäßig steht der Wert auf false. Wenn er auf true gesetzt wird, findet eine zusätzliche Authentifizierungsüberprüfung statt, um erkennen zu können, ob die verborgenen Variablen, die den Anzeigestatus enthalten, modifiziert wurden. autoEventWireup regelt, ob Seitenereignisse automatisch weitergeleitet werden oder nicht. smartNavigation stellt die Unterstützung für die »intelligente Navigation« ein oder ab. pageBaseType gibt eine Code-Behind-Klasse an, die aspx-Seiten standardmäßig erben. userControlBaseType gibt eine Code-Behind-Klasse an, die Benutzersteuerelemente standardmäßig erben.
| Tipp Noch etwas erklärungsbedürftig ist das Attribut smartNavigation. Wenn das Attribut auf true steht, dann profitieren Anwender ab dem Internet Explorer 5 von einer komfortableren Anzeige. Die Option bietet sich insbesondere dann an, wenn eine Seite Postbacks ausführt, der Inhalt der Seite selbst sich durch die Postbacks aber nur geringfügig ändert. Das auffälligste Resultat dieser Option besteht darin, dass auch bei einem Postback die Position der Seite erhalten bleibt. Wenn der Anwender auf der Seite nach unten gescrollt hat, dann bleibt auch nach dem Postback dieser untere Teil der Seite sichtbar. Außerdem flackert die Seite nicht und der Fokus verändert sich nicht. Für den Anwender verringert sich dadurch die Anzahl der benötigten Scroll- und Klickvorgänge. |
Die Werte aus dem pages-Abschnitt bilden die Voreinstellungen für alle aspx-Seiten. Die Page-Direktive der einzelnen Seite kann diese Voreinstellungen überschreiben.
<sessionState mode="Off|Inproc|StateServer|SQLServer"
cookieless="true|false"
timeout="Anzahl Minuten"
stateConnectionString="tcpip=server:port"
sqlConnectionString="connection string" />
Im Abschnitt sessionState regeln Sie die Sitzungsverfolgung. Mit dem mode-Attribut können Sie die Sitzungsverfolgung ausschalten oder eine von drei Varianten auswählen: Inproc führt die Sitzungsverfolgung im Prozessraum des Webservers aus. Diese Option bietet die größte Performance. Mit mode="StateServer" verwenden Sie einen eigenen Server für die Sitzungsverfolgung. In diesem Fall müssen Sie bei stateConnectionString nähere Angaben machen. Mit mode="SQLServer" verwenden Sie einen SQL Server für die Sitzungsverfolgung und geben mit sqlConnectionString die benötigten Verbindungsdaten an. Die Sitzungsverfolgung kann über das Attribut cookieless mit oder ohne Cookies realisiert werden. timeout regelt die Zeit, nach der eine Sitzung verfällt.
Weitere Hinweise zur Verwendung der einzelnen Attribute finden Sie in Kapitel 11, Der Status von Seiten, Sitzungen und Applikationen.
Ein location-Abschnitt steht in der Hierarchie direkt unterhalb des configuration-Abschnitts, ist also nicht Teil des Konfigurationsabschnitts system.web.
Ein location-Abschnitt bietet die Möglichkeit, Konfigurationseinstellungen für einzelne Dateien oder Verzeichnisse vorzunehmen. Hierfür steht das Attribut path zur Verfügung. Im path-Attribut können Sie eine einzelne Datei oder ein Verzeichnis angeben. Wenn sich die Konfigurationseinstellungen eines location-Abschnitts auf ein Verzeichnis beziehen, dann hat dieser location-Abschnitt den gleichen Effekt, den eine web.config-Datei in diesem Verzeichnis hätte.
| Tipp Mit anderen Worten: Sie haben die Wahl. Entweder legen Sie in dem Verzeichnis, das auf besondere Weise konfiguriert werden soll, eine eigene web.config an, oder Sie pflegen eine einzelne zentrale web.config-Datei und konfigurieren einzelne Verzeichnisse oder auch einzelne Dateien mit Hilfe des location-Abschnitts. Hier ein Beispiel. Die web.config im Stammverzeichnis enthält folgenden Eintrag: |
<configuration>
<location path="myDir">
<system.web>
<authorization>
<deny users="?" />
</authorization>
</system.web>
</location>
</configuration>
|
Diese Konfiguration verhindert den Zugriff anonymer Anwender auf das Verzeichnis myDir.
Weil ein location-Abschnitt im Prinzip wie eine eigene web.config funktioniert, ist der Inhalt eines location-Abschnitts auch so aufgebaut wie eine web.config. Im Beispiel erkennen Sie, dass innerhalb des location-Abschnitts ein eigener system.web-Abschnitt beginnt, der dann entsprechende Abschnitte wie etwa den authorization-Abschnitt enthält.
Ein Entwickler hat zwei Möglichkeiten, in der web.config eigene Angaben zu speichern. Im Abschnitt appSettings kann er eigene Schlüssel-Wert-Paare ergänzen. Außerdem besteht die Möglichkeit, eigene Abschnitte zu definieren und dabei auch einen individuellen Rückgabetyp festzulegen. Im Folgenden werden beide Möglichkeiten erläutert.
Das appSettings-Element wird direkt unterhalb des configuration-Elements platziert. Im Konfigurationsabschnitt appSettings definieren Sie eigene Anwendungseinstellungen, indem Sie Elemente vom Typ add hinzufügen. Ein add-Element hat die Attribute key und value. Ein Beispiel:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
...
<appSettings>
<add key="Versionsnummer" value="1.00e" />
</appSettings>
...
</configuration>
Hiermit definieren Sie den Schlüsselwert Versionsnummer mit dem Wert 1.00e. Innerhalb Ihres Codes rufen Sie den Wert mit folgendem Ausdruck ab:
ConfigurationSettings.AppSettings("Versionsnummer")
Wenn Sie Einträge im appSettings-Abschnitt machen, können Sie nur Werte vom Typ String zurückgeben. ASP.NET bietet Ihnen eine weiter gehende Möglichkeit, eigene Konfigurationseinträge festzulegen. Sie können für web.config eigene Abschnitte definieren und dabei festlegen, wie ASP.NET die Inhalte dieser Abschnitte auswertet.
| Tipp Der wesentliche Unterschied zu den Einträgen im appSettings-Abschnitt besteht darin, dass Sie über selbst definierte Einträge auch Werte beliebigen Typs zurückgeben können. Der Wert, den Sie über den Schlüssel abrufen, kann nicht nur ein String, sondern auch ein beliebiges Objekt sein. |
Dieses Verfahren lässt sich am besten an einem Beispiel demonstrieren. In Ihrer Webanwendung möchten Sie eine Nachricht des Tages verwenden. Diese Nachricht wird täglich aktualisiert und auf der Startseite angezeigt. In web.config möchten Sie festlegen, in welcher Datei ASP.NET diese Nachricht findet. Im Prinzip ließe sich das auch über einen Eintrag unter appSettings realisieren, indem Sie hier etwa über den Schlüssel NachrichtDesTages den jeweiligen Pfad zugänglich machen würden. Sie möchten es aber noch bequemer haben. Ihre Konfigurationseinstellung soll nicht den Dateipfad zurückgeben, sondern sofort ein Objekt vom Typ StreamReader.
In web.config benötigen Sie also etwa folgenden Eintrag:
<NachrichtDesTages file="c:\motd.txt" />
Das Problem ist nur, dass ASP.NET einen Abschnitt NachrichtDesTages zunächst nicht kennt und auch nicht weiß, dass es die angegebene Datei als StreamReader-Objekt zur Verfügung stellen soll.
Dafür müssen Sie ASP.NET Ihre Wünsche ausdrücklich mitteilen. Im Abschnitt <configuration><configSections><sectionGroup name="system.web" > definieren Sie mit einem <section>-Element Ihren eigenen Abschnitt, etwa so:
<configuration>
<configSections>
<sectionGroup name="system.web" >
<section name="NachrichtDesTages"
type="meineAbschnittshandler.
NachrichtDesTages, meineAbschnittshandler" />
</sectionGroup>
</configSections>
<configuration>
Das name-Attribut des section-Elements legt den Namen fest, unter dem Ihr Konfigurationselement in web.config verwendet wird, das ist hier NachrichtDesTages. Das type-Attribut legt zwei Dinge fest (beachten Sie das Komma in dem String, der dem Attribut type zugewiesen wird): Zunächst legt es den Namen der Klasse einschließlich Namespace fest, die den Abschnitts-Handler enthält. Das soll hier meineAbschnittshandler.NachrichtDesTages sein. Und diese Klasse ist enthalten in der Assembly meineAbschnittshandler. Diese Information steht nach dem Komma. ASP.NET weiß, dass eine Assembly in einer entsprechenden Datei mit der Ergänzung dll enthalten ist.
Und nun müssen Sie noch diese Klasse meineAbschnittshandler.NachrichtDesTages erstellen.
Wenn Sie eine Klasse für Ihren eigenen Abschnitts-Handler erstellen, muss diese Klasse die Schnittstelle IConfigurationSectionHandler unterstützen. Diese Schnittstelle erfordert die Implementierung einer entsprechenden create-Methode. Als äußerer Rahmen für Ihre Klasse ergibt sich damit diese Form.
Imports System
Imports System.Configuration
Imports System.Xml
Namespace meineAbschnittshandler
Public Class NachrichtDesTages
Implements IConfigurationSectionHandler
Public Function Create ( _
ByVal parent As Object, _
ByVal configContext As Object, _
ByVal section As XmlNode) _
As Object _
Implements IConfigurationSectionHandler.Create
' ... Ihr individueller Code ...
return x ' das Objekt, das zurückgegeben wird
End Function
End Class
End Namespace
Den Namen des Namespace können Sie beliebig wählen. Worauf es ankommt, ist der Hinweis Implements IConfigurationSectionHandler bei der Klassendefinition. Außerdem muss die Funktion Create mit der hier gezeigten Signatur und dem Hinweis Implements IConfigurationSectionHandler.Create definiert werden.
Ihre Klasse soll ein StreamReader-Objekt von der Datei zurückgeben, die bei der Konfiguration von NachrichtDesTages im Attribut file angegeben wird. Sie erinnern sich daran, wie der Abschnitt aussehen soll:
<NachrichtDesTages file="c:\motd.txt" />
Die Datei meineAbschnittshandler.vb realisiert diese Anforderung:
' meineAbschnittshandler.vb
Imports System
Imports System.Configuration
Imports System.Xml
Namespace meineAbschnittshandler
Public Class NachrichtDesTages
Implements IConfigurationSectionHandler
Public Function Create ( _
ByVal parent As Object, _
ByVal configContext As Object, _
ByVal section As XmlNode) _
As Object _
Implements IConfigurationSectionHandler.Create
Dim datnam As String
datnam = section.Attributes.Item(0).Value
Dim reader As System.IO.StreamReader
reader = new System.IO.StreamReader (datnam)
return reader
End Function
End Class
End Namespace
Die Funktion greift über die Eigenschaft Attributes auf das Attribut file zu. Nachdem die Funktion das gewünschte StreamReader-Objekt erzeugt hat, gibt sie das Objekt mit return reader zurück.
Kompilieren Sie diese Klasse mit folgendem Aufruf:
vbc /t:library /out:../bin/meineAbschnittshandler.dll /r:System.dll /r:System.xml.dll meineAbschnittshandler.vb
Je nachdem, wo Ihre Quelldatei liegt, müssen Sie den /out-Parameter so anpassen, dass die zu erzeugende dll-Datei im /bin-Verzeichnis der Webanwendung erstellt wird.
Wenn Sie so weit sind, bleibt nur noch die Aufgabe, die selbst erstellte Konfiguration aus einer aspx-Seite heraus aufzurufen. Hier ein entsprechendes Code-Fragment:
Dim myObject As Object
Dim myStream As System.IO.StreamReader
myObject = ConfigurationSettings.GetConfig _
("system.web/NachrichtDesTages")
myStream = CType (myObject, System.IO.StreamReader)
ausgabe.innerText = myStream.ReadToEnd()
Die zentrale Zeile ist
myObject = ConfigurationSettings.GetConfig _ ("system.web/NachrichtDesTages")
Hier wird die Konfiguration des Abschnitts system.web/NachrichtDesTages ausgelesen. Die Methode GetConfig gibt stets ein Objekt vom Typ Object zurück. Im Rahmen des Codes erfolgt daher eine ausdrückliche Umwandlung des zurückgegebenen Objekts in den Typ StreamReader.
Der entscheidende Vorteil der Konfiguration mit Hilfe der web.config-Dateien besteht darin, dass sich auch ein remote stehender Webserver auf diese Weise denkbar einfach steuern lässt. Wenn Sie FTP-Zugriff auf die Website haben, können Sie durch einfaches Austauschen der web.config-Dateien problemlos die Konfiguration anpassen. Durch diese Änderung wird die Webanwendung außerdem neu gestartet.
| << zurück |
| ||||||||||||
| ||||||||||||
| ||||||||||||
| ||||||||||||
| ||||||||||||
| ||||||||||||
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.