GLOBAL.ASA |
Die Datei GLOBAL.ASA ist der Ort, an dem Sie Objekte, Variablen und Ereignisprozeduren deklarieren (insbesondere für die Ereignisprozeduren OnStart und OnEnd der Objekte Application und Session), die sitzungs- oder anwendungsweite Gültigkeit haben. Für jedes virtuelle Verzeichnis bzw. jede ASP-Anwendung kann nur eine GLOBAL.ASA-Datei vorhanden sein. Gehen wir beispielsweise von einer ASP-Suchanwendung aus, die aus allen Skripts im virtuellen Verzeichnis /Search besteht. Das virtuelle Verzeichnis darf nur eine GLOBAL.ASA-Datei enthalten, und diese muss sich am Stamm des Verzeichnisses (/Search befinden). Eine etwaige weitere GLOBAL.ASA-Datei in einem beliebigen Unterverzeichnis von /Search wird von ASP.DLL ignoriert. Die Datei GLOBAL.ASA kann nicht-anzeigbaren Inhalt aufweisen. Derartige Inhalte werden von ASP.DLL ignoriert. Nicht mit dem Tag <SCRIPT> umschlossene Skripts sowie die Instantiierung von Serverkomponenten, die keine sitzungs- oder anwendungsweiten Gültigkeitsbereiche unterstützen, erzeugen Fehler. Diese Datei muss GLOBAL.ASA heißen und darf an keinem anderen Ort als am Stamm des virtuellen Verzeichnisses gespeichert sein, aus dem die ASP-Anwendung besteht. Wie auch andere Skripts können Sie in der Datei GLOBAL.ASA jede beliebige unterstützte Skriptsprache verwenden und in derselben Sprache geschriebene Ereignisprozeduren mit einem Satz der Tags <SCRIPT>...</SCRIPT> zusammenfassen. Im Abschnitt "Datei GLOBAL.ASA" in diesem Kapitel werden die folgenden Themen behandelt: Ereignisse des Objekts Application und anwendungsweite Gültigkeit Ereignisse des Objekts Session und sitzungsweite Gültigkeit Deklarationen der Typbibliothek

GLOBAL.ASA: Anmerkungen/Fehlerbehebung |
Wenn Sie die Datei GLOBAL.ASA für eine Anwendung ändern, schließt der Webserver zunächst alle ausstehenden Anforderungen für diese Anwendung ab, bevor er die Datei GLOBAL.ASA neu kompiliert. Laut Microsoft wird die Datei nach der Verarbeitung der aktuellen Anforderungen neu kompiliert, und neue Sitzungen, die in der aktuellen Anwendung gestartet werden, lösen die Verarbeitung des Codes der Datei GLOBAL.ASA aus. Während dieser Neukompilierung ignoriert der Server neue Skript-Anforderungen in der Anwendung. Tatsächlich aber funktioniert dies mit Personal Web Server, IIS 3.0 und IIS 4.0 leider überhaupt nicht. Sie sind gezwungen, das System neu zu starten, bevor die neue Datei GLOBAL.ASA verarbeitet wird! Auf Sitzungen, die währenddessen aktiv bleiben, wirken sich Ihre Änderungen an GLOBAL.ASA nicht aus. Nach der Neukompilierung der Datei GLOBAL.ASA durch den Webserver werden alle aktiven Sitzungen gelöscht und die Ereignisprozeduren Session_OnEnd und Application_OnEnd in der (neuen) Datei GLOBAL.ASA aufgerufen. Zum Starten neuer Sitzungen müssen die Benutzer neue Anforderungen an die Anwendung senden. Alle neuen Sitzungen beginnen mit der Verarbeitung der neuen Datei GLOBAL.ASA. Wenn Sie eigene GLOBAL.ASA-Dateien schreiben, beachten Sie unbedingt, dass eine Änderung des Codes in der Datei durch eine Server-Side Include-Datei keine Neukompilierung der Datei GLOBAL.ASA durch den Webserver zur Folge hat. Sie müssen die Datei GLOBAL.ASA erst neu speichern (selbst wenn sie nicht verändert wurde!), um eine Neukompilierung auszulösen. Die Datei GLOBAL.ASA kann Prozeduren und Funktionen enthalten. Allerdings können diese Prozeduren nur von den Ereignisprozeduren Session_OnStart, Session_OnEnd, Application_OnStart und Application_OnEnd aufgerufen werden (die alle an keinem anderen Ort als in der Datei GLOBAL.ASA gespeichert sein dürfen). Falls Sie diese Funktionen bzw. Prozeduren in anderen Dateien Ihrer Anwendung verwenden möchten, bietet sich eine Server-Side Include-Datei an, die das aufzurufende Skript enthält. Schließlich ist auch darauf zu achten, die Datei GLOBAL.ASA, wie jedes andere Skript in Ihrer Webanwendung, mit Windows NT-Sicherheitsfunktionen zu schützen. Anderenfalls haben Clients einen ungehinderten Zugriff auf die Datei. Angesichts der Tatsache, dass eine GLOBAL.ASA-Datei häufig sicherheitsbezogenen Code für die Anwendung enthält, ist diese Warnung äußerst wichtig.

Ereignisse des Objekts Application und anwendungsweite Gültigkeit |
    <SCRIPT LANGUAGE=strLangEngine RUNAT = SERVER>
    Sub Application_OnStart
          Event procedure code...
    End Sub

    Sub Application_OnEnd
          Event procedure code...
    End Sub
    </SCRIPT>
    <SCRIPT LANGUAGE=strLangEngine RUNAT = SERVER>
    Sub Application_OnStart
          Event procedure code...
    End Sub

    Sub Application_OnEnd
          Event procedure code...
    End Sub
    </SCRIPT>
Die Datei GLOBAL.ASA kann Ereignisprozedur-Code für die zwei Ereignisse des Objekts Application enthalten. Dabei handelt es sich um die Ereignisse: OnStart und OnEnd. Diese Ereignisse werden ausgelöst, wenn der erste Client eine Seite aus Ihrer Anwendung anfordert bzw. zum Abschluss der letzten Benutzersitzung in Ihrer Anwendung. Diese Ereignisse werden in Kapitel 4 ausführlich behandelt. In diesem Kapitel sollen einige der dort behandelten Themen wiederholt und im Hinblick auf die Datei GLOBAL.ASA und ihre Verwendung betrachtet werden. Wie bereits im Kapitel "Application-Objekt" ausgeführt, besteht eine ASP-Anwendung aus allen in einem virtuellen Verzeichnis und dessen Unterverzeichnissen befindlichen Dateien. Variablen oder Objekte mit anwendungsweiter Gültigkeit besitzen für jeden aktuellen Benutzer der Anwendung dieselben Werte, und jeder Benutzer kann die Werte einer anwendungsweiten Variable bzw. eines anwendungsweiten Objekts ändern. Eine solche Änderung wirkt sich für alle nachfolgenden Benutzer gleichermaßen auf den Wert aus.
Parameter
strLangEngine Ein String, dessen Wert den Namen einer gültigen serverseitigen Skripting-Engine darstellt. Bei IIS-Webservern ist dies standardmäßig VBScript, es können aber auch JScript, PerlScript, Python, REXX oder beliebige andere Skripting-Engines verwendet werden, die den IIS-Skriptkontext unterstützen.
Beispiel
    [Excerpt from GLOBAL.ASA]

    <OBJECT RUNAT=Server
    SCOPE=Application
    ID=AppInfo1
    PROGID="MSWC.MyInfo">
    </OBJECT>

    <SCRIPT LANGUAGE = "VBScript" RUNAT="Server">
    Sub Application_OnStart

        Dim objCounters
        Dim gdatAppStartDate

        ' The following object variable will hold a Counters
        ' component.
        Set objCounters = Server.CreateObject("MSWC.Counters")

        ' The following application-level variable will
        ' hold the start date of the application.
        gdatAppStartDate = Date( )

    End Sub

    Sub Application_OnEnd

        ' The following code destroys the application-scoped
        ' Counters component.
        Set objCounters = Nothing

        ' The following clears the application-level variable.
        gdatAppStartDate = "

        ' NOTE: This code is not strictly necessary in this
        ' instance as this object and variable will be released
        ' from memory by the web server itself when the application
        ' ends. This example simply demonstrates how these event
        ' procedures work. For suggestions for the Application
        ' object's use, see the following and Chapter 4.

    End Sub

    </SCRIPT>
Hinweis
Einige Hinweise zur Datei GLOBAL.ASA im Allgemeinen und zu den Ereignisprozeduren von Application im Einzelnen sollten Sie sich merken. Erstens: Es gibt keinen Grund, unbedingt eine GLOBAL.ASA-Datei zu führen. Ihre ASP-Anwendung funktioniert auch vollkommen normal ohne sie. Der Verzicht auf eine GLOBAL.ASA-Datei begünstigt sogar die Geschwindigkeit des Zugriffs auf die erste angeforderte Seite in Ihrer ASP-Anwendung, da es auf jeden Fall langsamer ist, zuerst die Datei GLOBAL.ASA und dann das angeforderte Skript, anstatt einfach nur das angeforderte Skript auszuführen. Zweitens: Wenn Sie eine GLOBAL.ASA-Datei führen, besteht nicht wirklich die Notwendigkeit, eine eigene Application_OnEnd-Ereignisprozedur zu schreiben, da der Webserver am Ende der Anwendung von sich aus den von anwendungsweiten Objekten und Variablen belegten Speicher freigibt. Wenn Sie jedoch spezifische Informationen über die Laufzeit einer Anwendung speichern möchten (z. B. in einer Datenbank), könnten Sie Code hierfür in die Ereignisprozedur Application_OnEnd einfügen. So könnten Sie beispielsweise eine anwendungsweite Seitenzähler-Variable erzeugen und ihren Wert bei Anwendungsende in einer Textdatei erfassen, so dass er für die nächste Anforderung der Dateien aus der Anwendung und den nächsten Start der Anwendung zur Verfügung steht. (Für diesen Vorgang gibt es allerdings bessere Möglichkeiten.) Weitere Hinweise zu den Ereignisprozeduren des Objekts Application finden Sie in Kapitel 4.

Ereignisse des Objekts Session und sitzungsweite Gültigkeit |
    <SCRIPT LANGUAGE=strLangEngine RUNAT = SERVER>
    Sub Session_OnStart
          Event procedure code...
    End Sub

    Sub Session_OnEnd
          Event procedure code...
    End Sub
    </SCRIPT>
    <SCRIPT LANGUAGE=strLangEngine RUNAT = SERVER>
    Sub Session_OnStart
          Event procedure code...
    End Sub

    Sub Session_OnEnd
          Event procedure code...
    End Sub
    </SCRIPT>
Die Datei GLOBAL.ASA kann Ereignisprozedur-Code für die zwei Ereignisse des Objekts Session enthalten. Dabei handelt es sich um die Ereignisse: OnStart und OnEnd. Diese Ereignisse werden ausgelöst, wenn ein Client zum ersten Mal eine Seite aus Ihrer Anwendung anfordert bzw. zum Abschluss der Benutzersitzung (standardmäßig 20 Minuten nach der letzten Anforderung des Benutzers). Diese Ereignisse werden in Kapitel 10 ausführlich behandelt. In diesem Kapitel sollen einige der dort behandelten Themen wiederholt und im Hinblick auf die Datei GLOBAL.ASA und ihre Verwendung betrachtet werden.
Parameter
strLangEngine Ein String, dessen Wert den Namen einer gültigen serverseitigen Skripting-Engine darstellt. Bei IIS-Webservern ist dies standardmäßig VBScript, es können aber auch JScript, PerlScript, Python, REXX oder beliebige andere Skripting-Engines verwendet werden, die den IIS-Skriptkontext unterstützen.
Beispiel
    [Excerpt from GLOBAL.ASA]

    <OBJECT RUNAT=Server
    SCOPE=Session
    ID=Tool1
    PROGID="MSWC.Tools">
    </OBJECT>

    <SCRIPT LANGUAGE = "VBScript" RUNAT="Server">
    Sub Session_OnStart

        Dim strLogonUser
        Dim StrUserSecurity

        ' The following session-level variables will hold
        ' the user's logon name and security clearance.
        strLogonUser = Request.ServerVariables("USER_LOGON")
        strUserSecurity = "PUBLIC"

    End Sub

    Sub Session_OnEnd

        ' The following code destroys the session-scoped
        ' Tools component.
        Set Tool1 = Nothing

        ' The following clears the session-level variables.
        strLogonUser = "
        strUserSecurity = "

        ' NOTE: This code is not strictly necessary in this
        ' instance as this object and variable will be released
        ' from memory by the web server itself when the session
        ' ends. This example simply demonstrates how these event
        ' procedures work. For suggestions for the Application
        ' object's use, see later in this chapter and Chapter 10.

    End Sub

    </SCRIPT>
Hinweis
Weitere Hinweise zu den Ereignisprozeduren des Objekts Session finden Sie in Kapitel 10.

Deklarationen der Typbibliothek |
    <!-- METADATA TYPE="TypeLibrary"
    FILE="FileName"
    UUID="TypeLibraryUUID"
    VERSION="MajorVersionNumber.MinorVersionNumber"
    LCID="LocaleID"
    -->
    <!-- METADATA TYPE="TypeLibrary"
    FILE="FileName"
    UUID="TypeLibraryUUID"
    VERSION="MajorVersionNumber.MinorVersionNumber"
    LCID="LocaleID"
    -->
Typbibliotheken sind Zubehördateien, die Informationen über die Eigenschaften und Methoden von COM-Objekten enthalten. Diese Dateien beschreiben sowohl die von den Objekten verwendeten Konstanten als auch den Datentyp zulässiger Eigenschaftswerte. Durch den Einsatz einer Typbibliothek erhalten Sie von Ihrer Anwendung genauere Meldungen über Fehler in der Verwendung des Objekts, auf das sich die jeweilige Typbibliothek bezieht. Eine solche Bibliothek ermöglicht Ihnen außerdem, in der DLL des Objekts definierte Konstanten zu verwenden. Der Code von Objekten wird dadurch mitunter sehr viel weniger kompliziert und wesentlich leichter lesbar und kann wiederverwendet werden, ohne dass Sie Server-Side Includes erzeugen müssen, die bei mehreren Objekte oft schwer zu pflegen sind. Wie Sie bereits wissen, können Sie anwendungsweite und sitzungsweite Objekte in der Datei GLOBAL.ASA instantiieren. Ist für eines dieser Objekte eine entsprechende Typbibliothek vorhanden, können Sie deren Verwendung in der Datei GLOBAL.ASA der Anwendung deklarieren.
Parameter
Dateiname Der vollständige physische (nicht virtuelle) Pfad und Dateiname der Typbibliotheksdatei für das betreffende Objekt. Wenn Sie sowohl den Parameter Dateiname als auch Typbib-UUID in dieTypeLibrary-Deklaration aufnehmen, identifiziert der Webserver die Typbibliothek anhand ihres Dateinamens. Sie müssen einen der Parameter Dateiname oder Typbib-UUID angeben. Typbib-UUID Die UUID (Universally Unique Identification Number) der Typbibliothek. Diese unterscheidet sich von der UUID für das COM-Objekt und ist in der Registrierung als Unterschlüssel von HKEY_CLASSES_ROOT\TypeLib definiert. Wenn Sie sowohl den Parameter Dateiname als auch Typbib-UUID in dieTypeLibrary-Deklaration aufnehmen, identifiziert der Webserver die Typbibliothek anhand ihres Dateinamens. Sie müssen einen der Parameter Dateiname oder Typbib-UUID angeben. Hauptversionsnummer Die Hauptversionsnummer der Typbibliothek. Ist dieser optionale Parameter angegeben und der Webserver kann die Datei mit der richtigen Hauptversionsnummer nicht finden, erzeugt er einen Fehler. Wenn Sie eine Hauptversionsnummer angeben, müssen Sie auch den Parameter Nebenversionsnummer angeben. Nebenversionsnummer Die Nebenversionsnummer der Typbibliothek. Ist dieser optionale Parameter angegeben und der Webserver kann die Datei mit der richtigen Nebenversionsnummer nicht finden, erzeugt er einen Fehler. Wenn Sie eine Nebenversionsnummer angeben, müssen Sie auch den Parameter Hauptversionsnummer angeben. SprachumgID Jede Typbibliothek kann unterschiedliche Sprachumgebungen unterstützen. Der Parameter SprachumgID stellt die für die betreffende Typbibliothek zu verwendende Sprachumgebung dar. Kann diese Sprachumgebung in der Typbibliothek nicht gefunden werden, so generiert der Webserver einen Fehler. Wie der Parameter VERSION der Deklaration TypeLibrary ist auch dieser Parameter optional.
Beispiel
    [Excerpt from GLOBAL.ASA]

    <!-- METADATA TYPE="TypeLibrary"
    FILE="Report.LIB"
    VERSION="1.5"
    LCID="1306"
    -->
Hinweis
Mit diesem Code wird die Verwendung von Version 1.5 der Typbibliothek des COM-Objekts Report deklariert. Die Sprachumgebungskennung (LCID) ist diejenige für Französisch. Wenn Version 1.5 der Typbibliothek dieses COM-Objekts nicht gefunden werden kann oder die Typbibliothek die Sprachumgebung mit der LCID 1306 (Französisch) nicht unterstützt, generiert der Code einen Fehler. Wenn Sie in einer ASP-Anwendung mit einer Typbibliothek arbeiten, verwenden Sie eigentlich eine in einem Wrapper eingeschlossene Version der Typbibliothek. IIS erzeugt diesen Wrapper für Ihre Typbibliothek im Hintergrund. Für den guten Kodierstiel empfiehlt Microsoft, die Deklarationen der Typbibliothek in den Anfangsbereich der Datei GLOBAL.ASA zu stellen. Allerdings konnte der Autor keine Auswirkungen einer anderweitigen Platzierung der Deklarationen in der Datei feststellen. Außerdem muss die TypeLibrary-Deklaration nicht außerhalb der <SCRIPT>-Tags platziert werden. Eines der Probleme, die der Einsatz von Typbibliotheken aus mehreren COM-Objekten in einer ASP-Anwendung aufwirft (besonders dann, wenn die COM-Objekte von unterschiedlichen Programmierern stammen), ist die Konstantenredundanz innerhalb des Objekts. Indem Sie beim Verweisen auf Konstanten den Namen des COM-Objekts selbst als Präfix für den jeweiligen Konstantennamen verwenden, lässt sich diese Redundanz vermeiden. So können Sie beispielsweise auf die Konstante adStoredProcedure der ADODB-Typbibliothek mit ADODB.adStoredProcedure verweisen. Falls Sie die Typbibliothek falsch deklarieren, kann der Webserver einen der in nachfolgender Tabelle aufgeführten Fehler ausgeben:
Fehlercode | Beschreibung
ASP 0222 | Eine ungültige Deklaration einer Typbibliothek.
ASP 0223 | Die Typbibliothek ist nicht vorhanden. Diesen Fehler erhalten Sie, wenn beispielsweise die im METADATA-Tag angegebene Typbibliothek nicht vorhanden ist.
ASP 0224 | Die deklarierte Typbibliothek wurde zwar gefunden, konnte aber aus einem unbekannten Grund nicht geladen werden.
ASP 0225 | Der Webserver kann aus irgendeinem Grund keinen Wrapper für die im METADATA-Tag deklarierte Typbibliothek erzeugen.