Application-Objekt  

Im Kontext von Active Server Pages versteht man unter einer Anwendung (Application) die Summe aller Dateien, auf die über ein virtuelles Verzeichnis und dessen Unterverzeichnisse zugegriffen werden kann. Dieser ASP-Anwendungskontext ist für alle auf die Anwendung zugreifenden Clients identisch. So greift beispielsweise ein Client aus Thailand, der Seiten aus Ihrem virtuellen Verzeichnis /SearchApp anfordert, auf dieselbe "Anwendung“ zu wie ein Client aus Schweden, der Seiten aus demselben virtuellen Verzeichnis anfordert. Dabei spielt es keine Rolle, welche Webseite aus dem virtuellen Verzeichnis angefordert wird.

Ebenso wie herkömmliche Einzelplatzanwendungen erlauben auch ASP-Anwendungen die gemeinsame Verwendung von Daten innerhalb der Anwendung. Mit dem Objekt Application können Daten von allen Clients einer bestimmten ASP-Anwendung gemeinsam verwendet werden. Dieses integrierte Objekt stellt die ASP-Anwendung selbst dar und ist stets gleich, unabhängig von der Anzahl oder Art der auf die Anwendung zugreifenden Clients und unabhängig davon, welchen Teil oder welche Teile der Anwendung die Clients anfordern.

IIS initialisiert das Objekt Application, sobald der erste Client eine beliebige Datei aus dem virtuellen Verzeichnis anfordert. Es verbleibt so lange im Serverspeicher, bis entweder der Webdienst beendet oder die Anwendung ausdrücklich mit Microsoft Management Console vom Webserver gelöscht wird.

Mit IIS können Sie anwendungsweite Variablen und Objekte instantiieren. Das bedeutet, dass eine Variable für alle Clients Ihrer Anwendung denselben Wert besitzt. Außerdem können Sie serverseitige Objekte mit anwendungsweiter Gültigkeit instantiieren, die ebenso für alle Clients dieselben Werte enthalten. Diese anwendungsweiten Variablen und Objekte können aus dem Sitzungskontext eines beliebigen Benutzers und von jeder Datei in der aktuellen Anwendung aus aufgerufen und geändert werden.

Wie bereits erwähnt, erfolgt die Initialisierung des Objekts Application, sobald der erste Benutzer Ihrer Anwendung eine beliebige Datei aus dem virtuellen Verzeichnis anfordert, das zur ASP-Anwendung gehört. Diese Initialisierung kann man sich als Reservierung von Arbeitsspeicher für die betreffende ASP-Anwendung vorstellen. Die Instantiierung und Initialisierung des Objekts Application übernimmt der Webserver. Es ist jedoch möglich, die Initialisierung anzupassen. Hierzu fügen Sie Code in eine spezielle, optionale Datei ein: die Datei GLOBAL.ASA . Auf diese Datei wird in Kapitel 11 zwar noch genau eingegangen, sie soll hier aber bereits kurz dargestellt werden.

Die Datei GLOBAL.ASA finden Sie - sofern vorhanden - im Stammordner des "physischen“ Verzeichnisses, dem das virtuelle Verzeichnis Ihrer ASP-Anwendung zugeordnet ist. Jedes Mal, wenn ein neuer Benutzer eine Seite aus dem virtuellen Verzeichnis der Anwendung anfordert, wird diese Datei verarbeitet. Sie enthält Initialisierungscode für die Benutzersitzung und für die Anwendung selbst. Handelt es sich nicht um den ersten Benutzer, so werden die anwendungsspezifischen Teile von GLOBAL.ASA nicht verarbeitet. Wenn die Datei GLOBAL.ASA nicht existiert oder keinen Code enthält, es sich bei der Benutzeranforderung aber um die erste Anforderung des Webservers nach Dateien in einer bestimmten Anwendung handelt, dann wird das Objekt Application trotzdem vom Webserver initialisiert. Allerdings beschränkt sich die Initialisierung durch den Webserver darauf, der Anwendung eine bestimmte Arbeitsspeicherkapazität zuzuweisen.

Die Datei GLOBAL.ASA ist der Ort, an dem Sie Variablen und Objekte mit anwendungsweitem Gültigkeitsbereich erstellen können. Dieser Teil der Datei GLOBAL.ASA stellt eine Ereignisprozedur dar. Das Ereignis ist OnStart, dessen Ereignisprozedur beim Start der Anwendung ausgeführt wird. Beachten Sie bitte, dass die Datei GLOBAL.ASA zwar für jeden Benutzer verarbeitet wird, der eine Anforderung startet, aber das Ereignis OnStart des Objekts Application nur für den ersten Benutzer ausgeführt wird. (Auf die Ereignisprozedur OnStart und die entsprechende Ereignisprozedur OnEnd wird weiter unten in diesem Kapitel ausführlich eingegangen.)

Variablen und Objekte mit anwendungsweitem Gültigkeitsbereich haben jederzeit während des Lebenszyklus der Anwendung für alle Benutzer denselben Wert. Wenn ein Benutzer eine Seite mit Code anfordert, der den Wert einer anwendungsweiten Variablen ändert, so ändert sich der Wert dieser Variablen für alle Benutzer. Dadurch ergibt sich ein Problem: Theoretisch könnten zwei oder mehr Benutzer gleichzeitig versuchen, den Wert derselben anwendungsweiten Variablen zu ändern. Zur Vermeidung von Konflikten in einer derartigen Situation stellt ASP jedoch die Methoden Lock und Unlock des Objekts Application zur Verfügung. Genau wie bei der Verwendung von globalen Variablen in Multithread-Anwendungen, sind auch beim Einsatz von Variablen mit anwendungsweitem Gültigkeitsbereich deren weit verzweigten Auswirkungen genau zu berücksichtigen. Gehen Sie bei der Verwendung von anwendungsweiten Variablen vorsichtig vor.

Eine Beschreibung der Eigenschaften, Kollektionen, Methoden und Ereignisse des ASP-Objekts Application finden Sie unter Zusammenfassung zum Objekt Application.

Anmerkungen/Fehlerbehebung  
 
 

Anwendungsweite Variablen sind im Grunde genommen globale Variablen für Ihre ASP-Anwendung. Der Einsatz von globalen Variablen in ASP-Anwendungen ist mit mindestens so viel Skepsis zu betrachten wie die Verwendung von globalen Variablen in herkömmlichen Einzelplatzanwendungen. Der wichtigste Schritt vor jeder Implementierung anwendungsweiter Objekte oder Variablen ist die gewissenhafte Erwägung ihres Gültigkeitsbereichs. Nur sehr selten ist die Verwendung solcher globalen ASP-Variablen wirklich notwendig.

Diese Warnung vorangestellt, ist anzumerken, dass die Verwendung anwendungsweiter Variablen in einigen wenigen Fällen beim Erstellen von funktionellen ASP-Anwendungen hilfreich sein kann. Mit am wichtigsten ist hierbei die Pflege anwendungsspezifischer Statistiken für Ihre Website. So könnten Sie beispielsweise anhand von anwendungsweiten Variablen, deren Wert zu Beginn jeder Benutzersitzung erhöht wird, eine Zählung der Clients einrichten, die Ihre Anwendung verwenden. Web-Management-Tools wie beispielsweise Microsoft Site Server führen zwar ähnliche Vorgänge durch, doch ihre Statistik ist nicht anwendungs- sondern dateispezifisch.

Mitunter wird in der Literatur über ASP empfohlen, mit anwendungsweiten Objekten geöffnete ActiveX Data Objects (ADO)-Datenbankverbindungen für alle Anwendungsbenutzer zu verwalten. (Weitere Informationen zu ADO finden Sie in Kapitel 12.) Dies ist keine gute Verwendung anwendungsweiter Variablen, da sie das Pooling von Verbindungen auf Einzelseitenbasis durch ODBC verhindert. (Durchaus sinnvoll wäre es hingegen, mit einer anwendungsweiten Variablen einen anwendungsspezifischen Verbindungsstring für dieselbe Datenbankverbindung zu führen.)

Das Pooling von Verbindungen durch ODBC ist ein Verfahren, das es ermöglicht, ODBC-Verbindungen von nachfolgenden Benutzern wiederverwenden zu lassen. Anstatt bei jeder Anforderung durch einen Client eine neue Verbindung herzustellen, versucht der Server, eine bereits vorhandene, nicht mehr verwendete Verbindung wieder zu verwenden. Sollten nach einer bestimmten Dauer (im MMC konfiguriert) nicht verwendete ODBC-Verbindungen im Speicher vorliegen, werden sie zur Freigabe von Arbeitsspeicher gelöscht.

Einer Falle sollten Sie sich bewusst sein, wenn Sie die Verwendung von anwendungsweiten Variablen und Objekten in Betracht ziehen. Nehmen wir folgendes Szenario an: Sie verfügen über die beiden physischen Verzeichnisse c:\inetpub\wwwroot\MainApp und c:\inetpub\wwwroot\MainApp\SearchApp. Diese Verzeichnisse sind den virtuellen Verzeichnissen /MainApp und /SearchApp zugeordnet. Es handelt sich also eigentlich um eine Anwendung in einer Anwendung. Der erste Client fordert eine Seite aus dem physischen Verzeichnis c:\inetpub\wwwroot\MainApp\SearchApp an. Mit welchem Initialisierungscode wird das Objekt Application initialisiert - mit dem Code in der Datei GLOBAL.ASA für /MainApp oder in GLOBAL.ASA für /SearchApp? In diesem Fall wird /SearchApp GLOBAL.ASA verarbeitet. Solange eine Datei aus /MainApp angefordert wird, die in /SearchApp nicht existiert, wird die Datei GLOBAL.ASA für /MainApp nicht verarbeitet. Wenn die beiden GLOBAL.ASA-Dateien unterschiedliche Sätze anwendungsweiter Variablen definieren, können Sie nur mit Hilfe eines Tests feststellen, welche Application-Variablen ordnungsgemäß initialisiert wurden.

Zum Schluss soll darauf hingewiesen werden, dass IIS nun die Möglichkeit bietet, ASP-Anwendungen durch die Einrichtung in separaten Speicherbereichen untereinander sowie vom Webserver selbst zu trennen. Hierzu müssen Sie lediglich eine Option im Bedienfeld Eigenschaften des entsprechenden virtuellen Verzeichnisses in IIS Microsoft Management Console auswählen. Diese Fähigkeit stellt eine wichtige Verbesserung von IIS dar. Wenn Ihre ASP-Anwendung in einem von dem Webserver getrennten Speicherbereich ausgeführt wird und ein Serverobjekt in der Anwendung (oder die Skripting-Engine selbst) abstürzt, so bringt es weder den Webserver noch andere ASP-Anwendungen mit zum Abstürzen.

Kollektion Contents  
Application.Contents.Item("Pi") = 3.14
 

Die Kollektion Contents des Application-Objekts enthält alle Variablen und Objekte mit anwendungsweiter Gültigkeit, die der aktuellen Anwendung mit Hilfe von Skripts (nicht durch Verwendung des Tags <OBJECT>) hinzugefügt werden.

Bevor wir uns näher betrachten, wie der Kollektion Contents Elemente hinzugefügt werden, muss auf die Eigenschaften der Contents-Kollektion eingegangen werden. Die Kollektion Contents besitzt drei Eigenschaften:

Item

Ruft den Wert eines spezifischen Mitglieds der Kollektion Contents ab. Um welches Mitglied es sich handelt, bestimmen Sie mit Hilfe eines String-Schlüssels (dessen Wert über die Eigenschaft Key mit dem Index erhalten werden kann; mehr hierzu weiter unten) oder einer Indexzahl. Wenn Sie beispielsweise ein Element in der Kollektion Contents mit dem Wert "Pi" initialisieren möchten, können Sie eine Codezeile wie die folgende einsetzen:

Application.Contents.Item("Pi") = 3.14

In dieser Codezeile wird das gewünschte Element der Kollektion mit dem Schlüsselwert "Pi“ angegeben. Nach dieser Initialisierung können Sie mit folgender Codezeile den Wert des Elements aus der Kollektion Contents auslesen:

dblMyVar = Application.Contents.Item("Pi")

Aus Gründen, die gleich erklärt werden, lassen Sie uns nun annehmen, dass dies das erste Element ist, das der Kollektion Contents hinzugefügt wird.

Anstelle eines Schlüssels können Sie auch den Index eines Elements in der Contents-Kollektion verwenden, um dessen Wert abzurufen. Dies sehen Sie in der folgenden Codezeile:

dblMyVar = Application.Contents.Item(1)

Beachten Sie, dass das erste Element in der Contents-Kollektion nicht mit 0 (Null), sondern mit 1 (Eins) dargestellt wird. Dies ist deshalb von Bedeutung, weil eine Null in dieser Codezeile zur Initialisierung der Variablen db1MyVar mit einem unbestimmten Wert führen würde. Leider wird dies aber nicht als Fehler gemeldet. Das Ergebnis ist eine falsch initialisierte Variabel:

dblMyVar = Application.Contents.Item(0) ' WRONG.

Item ist die Standardeigenschaft der Contents-Kollektion, und die Contents-Kollektion ist die Standardkollektion des Objekts Application. Das bedeutet, dass die folgenden drei Codezeilen in Ihrer Anwendung auf exakt dieselbe Weise interpretiert werden:

Application.Contents.Item("Pi") = 3.14
Application.Contents("Pi") = 3.14
Application("Pi") = 3.14

Folglich könnte man annehmen, dass auch die folgenden drei Codezeilen gleichwertig sind:

Application.Contents.Item(1) = 3.14159
Application.Contents(1) = 3.14159
Application(1) = 3.14159

Dies ist jedoch nur dann der Fall, wenn das erste Element in der Contents-Kollektion zuvor mit Hilfe eines Schlüssels definiert wurde. Aus der mit ASP gelieferten Dokumentation geht dies zwar nicht hervor, aber die ersten beiden Codezeilen können nur verwendet werden, wenn das Element zuvor mit einem Schlüssel definiert wurde. Gehen wir davon aus, Sie möchten der Contents-Kollektion ein zweites Element hinzufügen. Das Element kann mit keiner der folgenden Codezeilen initialisiert werden:

Application.Contents.Item(2) = 3.14159     ' WRONG.
Application.Contents(2) = 3.14159          ' WRONG.

Leider aber gibt es auch für diese Ausnahme eine Ausnahme. Sie können eine zweite Variable mit dieser Codezeile initialisieren:

Application(2) = 3.14159

Angesichts dieses uneinheitlichen Verhaltens wird schnell klar, dass es immer sicherer ist, auf den Wert eines spezifischen Elements in der Kollektion Contents mit einem Schlüssel anstatt mit einem Index zu verweisen.

Es ist auch wichtig, sich mit einem Schlüssel auf ein bestimmtes Mitglied der Contents-Kollektion zu beziehen, da sich der Index dieses Mitglieds ändern kann. Nehmen wir an, Ihre Anwendung enthält folgenden Code:

Application("strFirstName") = "Arthur"
Application("strMiddleName") = "Keyton"
Application("strLastName") = "Weissinger"

Sofern dies die ersten drei der Contents-Kollektion hinzugefügten Variablen sind, könnten Sie sich später mit Hilfe des jeweiligen Index auf sie beziehen:

strFirst = Application(1) 
strMiddle = Application(2)
strLast = Application(3)

Wenn Sie aber mit der Methode Remove, die eine Variable vollständig aus der Kollektion entfernt (siehe weiter unten in diesem Kapitel), die Variable strMiddleName entfernen, ändern sich die Indizes:

Session.Contents.Remove("strMiddleName")

strFirst = Application(1)          ' Initializes to "Arthur" 
strMiddle = Application(2)         ' Initializes to "Weissinger"
strLast = Application(3)           ' Initializes to Undefined.
Key

stellt den Namen eines spezifischen Elements in der Contents-Kollektion dar. Wie bereits erwähnt, stellt die Eigenschaft Item den Wert jedes Elements dar. Ebenso stellt die Eigenschaft Key den Namen jedes Elements dar.

Wenn Sie den Namen eines bestimmten Schlüssels nicht kennen, rufen Sie ihn mit Hilfe seiner Ordnungszahl ab. Nehmen wir beispielsweise an, Sie möchten den Schlüsselnamen des dritten Elements in der Kollektion erfahren und anschließend dessen Wert abrufen. Hierfür könnten Sie folgenden Code verwenden:

strKeyName = Application.Contents.Key(3)
strKeyValue = Application.Contents.Item(strKeyName)
Count

stellt die Gesamtanzahl der Elemente in der Contents-Kollektion dar.

 
Hinweis

Zum Initialisieren anwendungsweiter Variablen und folglich zum Einfügen von Elementen in die Contents-Kollektion stehen Ihnen zwei Methoden zur Verfügung. Zunächst können Sie Application-Variablen in der Ereignisprozedur Application_OnStart in der Datei GLOBAL.ASA initialisieren, wie Beispiel 4.1 veranschaulicht.

Anwendungsweite Variablen in GLOBAL.ASA initialisieren

' < FROM GLOBAL.ASA >
' This code resides in the GLOBAL.ASA file at the
' root of the current application.
' See Chapter 11 for more details on the GLOBAL.ASA file.

Sub Application_OnStart

   Application.Contents.Item("STATE_FIRST") = "California"
   Application.Contents("STATE_SECOND") = "Oregon"
   Application("STATE_THIRD") = "Washington"

End Sub

Der Code in Beispiel 4.1 erzeugt drei anwendungsweite Variablen und fügt der Contents-Kollektion somit drei Elemente hinzu. Diese Variablen werden nur beim Start der Anwendung instantiiert und initialisiert und nicht bei jedem Besuch der Site durch nachfolgende Benutzer. Sie behalten immer dieselben Werte bei, sofern die Werte nicht von einem anderen Skript für alle Seiten und alle Benutzer geändert werden.

Der vorige Code fügt der Contents-Kollektion Elemente mit Hilfe eines Schlüssels hinzu. Sie können dies aber auch anhand eines Indexwerts vornehmen. Beispiel:

Application.Contents(1) = "California"

Fügen Sie einer Kollektion die gewünschten Elemente jedoch konsequent entweder per Schlüssel oder per Index hinzu. Verwenden Sie nicht beides. Anderenfalls überschreiben Elemente mit Schlüsseln andere Elemente an niedrigeren Ordinalpositionen, welchen keine Schlüssel zugewiesen wurden.

Außerdem können Sie anwendungsweite Variablen erstellen und damit der Contents-Kollektion in einem beliebigen Skript auf einer beliebigen Seite Elemente hinzufügen. Beachten Sie jedoch, dass sich alle auf diese Weise erstellten Variablen auf die gesamte Anwendung und all ihre Benutzer auswirken. Beispiel 4.2 zeigt dieses Verfahren der Initialisierung anwendungsweiter Variablen.

Anwendungsweite Variablen in einem serverseitigen Skript initialisieren

<%
' This code exists in the server-side section of a script
' on the web site.
Application.Contents.Item("STATE_FOURTH") = "New York"
Application.Contents("STATE_FIFTH") = "New Jersey"
Application("STATE_SIXTH") = "Vermont"

%>

Der Code in Beispiel 4.2 fügt der Anwendung drei weitere anwendungsweite Variablen hinzu. Diese drei Variablen werden jedes Mal neu initialisiert, wenn ein Benutzer die Seite anfordert, die diesen Code enthält. Mit Code wie dem nachfolgenden lässt sich eine solche Verschwendung von Prozessorleistung vermeiden:

<%
' A more efficient example of the creation of an 
' application-scoped variable.
If IsEmpty(Application.Contents.Item(STATE_SEVENTH)) Then
   Application.Contents(STATE_SEVENTH) = "Texas"
End If

%>

Mit diesem Code wird nur dann eine siebte Anwendungsvariable für die aktuelle Anwendung erzeugt, wenn diese Variable noch nicht vorhanden ist.

Die Kollektion Contents unterstützt die Konstrukte For Each und For...Next zur Iteration der Kollektion, wie aus Beispiel 4.3 hervorgeht.

For Each für die Contents-Kollektion verwenden

<%
For Each strKey in Application.Contents
%>
   The next item in Application's Contents collection<BR>
   has <%= strKey %> as its key and
   <%= Application.Contents(strKey) %>
   as its value.<P>
<%
Next %>

Beachten Sie aber, dass die Kollektion Contents im Gegensatz zu den meisten Kollektionsobjekten keine Unterstützung für die Methode Add bietet und bis zur Version IIS 5.0 auch keine Remove-Methode unterstützt hat. Sofern sie nicht ausdrücklich entfernt werden, verbleiben Variablen mit anwendungsweitem Gültigkeitsbereich so lange im Speicher, bis entweder der Webserver beendet wird oder die Sitzung des letzten Benutzers abläuft.

Wenn Sie der Contents-Kollektion von Application ein Objekt hinzufügen, vergewissern Sie sich, dass das Threading-Modell des Objekts seinen anwendungsweiten Einsatz zulässt. Es empfiehlt sich, auf das freie Threading-Modell zurückzugreifen. Weitere Informationen zur Verwendung verschiedener Threading-Modelle in IIS-Serverkomponenten finden Sie in Shelley Powers Buch Developing ASP Components im Verlag O'Reilly & Associates.

Nach dem freien Threading-Modell angelegte Anwendungen ermöglichen einen gleichzeitigen Zugriff auf dieselbe Instanz einer Komponente durch mehrere Benutzerprozesse.

Mit einer Erweiterung der zuvor betrachteten Syntax zum Abrufen des Werts einer anwendungsweiten Variablen greifen Sie auf die Eigenschaften oder Methoden eines anwendungsweiten Objekts zu. Der folgende Codeausschnitt veranschaulicht dies:

' In this example, assume you have an application-scoped Ad 
' Rotator variable called MyAdRot.

' Accessing a property:
intBorder = Application.Contents("MyAdRot").Border

' Executing a method:
Application.Contents("MyAdRot").GetAdvertisement("Sched.txt")

Falls Sie ein bestimmtes Objekt in einer Transaktion mit dem Objekt ObjectContext verwenden möchten, weisen Sie diesem Objekt weder einen anwendungs- noch einen sitzungsweiten Gültigkeitsbereich zu. In Transaktionen verwendete Objekte werden am Ende der Transaktion zerstört und nachfolgende Verweise auf ihre Eigenschaften oder Aufrufe ihrer Methoden erzeugen einen Fehler.

Wenn Sie der Kollektion Contents des Application-Objekts eine Liste hinzufügen möchten, fügen Sie die Liste als Ganzes hinzu. Falls eines der Elemente in der Liste geändert werden muss, rufen Sie eine Kopie der Liste ab, ändern Sie das Element, und fügen Sie der Contents-Kollektion erneut die ganze Liste hinzu. Der Code in Beispiel 4.4 veranschaulicht diesen Vorgang.

Mit Listen in der Contents-Kollektion arbeiten

<%
' Create an array variable and add it to Contents collection.
ReDim arystrNames(3)

arystrNames(0) = "Chris"
arystrNames(1) = "Julie"
arystrNames(2) = "Vlad"
arystrNames(3) = "Kelly"

Application("arystrUserNames") = arystrNames

%>

The second name in the User Names array is 
<%= Application("arystrUserNames")(1) %>
<BR>
<%

' Change an element of the array being held in the
' Contents collection.
Dim arystrNamesLocal

arystrNamesLocal = Application("arystrUserNames")
arystrNamesLocal(1) = "Mark"

Application("arystrUserNames") = arystrNamesLocal
' The second name is now Mark.

%>
Now, the second name in the User Names array is
<%= Application("arystrUserNames")(1) %>
<BR>
 
Remove  
Application.Contents.Remove(Schlüssel|Index)
 

Entfernt ein bestimmtes Mitglied aus der Contents-Kollektion. Darüber hinaus können Sie mit der Methode Remove in IIS 5.0 spezifische Variablen der Kollektion Contents des Application-Objekts aus dem Speicher entfernen, ohne dazu auch alle anderen Variablen zu löschen.

 
Parameter
Key

Eine String-Variable, die den Namen des aus dem Speicher zu entfernenden Mitglieds der Contents-Kollektion angibt.

Index

Eine Ganzzahlvariable (Integer), die den Index des aus dem Speicher zu entfernenden Mitglieds der Contents-Kollektion angibt.

 
Beispiel

Mit dem folgenden Skript werden zwei Mitglieder der Contents-Kollektion entfernt:

<%
' This script assumes you have set up two greeting salutations for all
' the members of your site based on time of day. You want to now 
' remove these from your site.
strAppMorningGreeting = Application("strAMGreet")
strAppEveningGreeting = Application("strPMGreet")

.
.
.
Application.Contents.Remove("strAMGreet")
Application.Contents.Remove("strPMGreet")
.
.
.
%>
 
Hinweis

Die Methode Remove stellt eine wichtige Ergänzung der Contents-Kollektion dar, da sie eine bessere Speicherverwaltung und -bereinigung ermöglicht. Mit Hilfe dieser Methode können Sie einige Elemente der Kollektion aus dem Speicher entfernen, ohne die Benutzersitzung aufgeben zu müssen. Wie zuvor unter der Beschreibung der Eigenschaft Item der Contents-Kollektion erklärt, ist es besonders wichtig, beim Aufruf der Methode Remove String-Schlüssel anstelle von Indizes zu verwenden. Der Index eines Elements kann sich im Laufe des Lebenszyklus einer Anwendung ändern. In diesem Fall liefert der Aufruf von Remove über einen gespeicherten Indexwert nicht absehbare Resultate.

Mit der Methode Remove der Contents-Kollektion des Application-Objekts können Sie Mitglieder der Contents-Kollektion entfernen, ohne dazu die gesamte Webanwendung über die IIS-Webadministrationsschnittstelle aus dem Speicher entfernen zu müssen. Das Fehlen einer solchen Funktion in IIS-Versionen vor 5.0 machte die Verwaltung von anwendungsweiten Variablen zu einer schwierigen Angelegenheit.

 
RemoveAll  
Application.Contents.RemoveAll
 

Entfernt alle Mitglieder aus der Contents-Kollektion. Mit der in IIS 5.0 neu eingeführten Methode RemoveAll können Sie alle anwendungsweiten Variablen aus dem Speicher entfernen, ohne die Anwendung selbst zu entladen.

 
Parameter

Keine

 
Beispiel

Mit dem folgenden Skript werden alle Mitglieder der Contents-Kollektion entfernt:

<%
' This script assumes you have set up two greeting salutations for all 
' the members of your site based on time of day. You want to now remove 
' these from your site.
strAppMorningGreeting = Application("strAMGreet")
strAppEveningGreeting = Application("strPMGreet")

.
.
.
Application.Contents.RemoveAll
.
.
.
%>
 
Hinweis

Wie Remove ist auch die Methode RemoveAll eine wichtige Ergänzung der Contents-Kollektion, da sie eine bessere Speicherverwaltung und -bereinigung ermöglicht. Mit ihr können Sie alle anwendungsweiten Variablen entfernen, ohne dazu die Anwendung selbst aus dem Speicher zu löschen.

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

Die Kollektion StaticObjects enthält alle Objekte, die der Anwendung mit Hilfe des Tags <OBJECT> hinzugefügt werden. Mit der Eigenschaft Item (s. weiter unten) der Kollektion StaticObjects können Sie Eigenschaften eines bestimmten Objekts in der Kollektion abrufen. Außerdem haben Sie die Möglichkeit, mit der Eigenschaft Item der Kollektion StaticObjects gezielt auf eine Methode eines bestimmten Objekts in der Kollektion zuzugreifen.

Objekte lassen sich der Kollektion nur mit Hilfe des Tags <OBJECT> in der Datei GLOBAL.ASA hinzufügen. Sehen Sie hierzu das folgende Beispiel:

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

An keiner anderen Stelle in Ihrer ASP-Anwendung können Sie dieser Kollektion Objekte hinzufügen.

Ebenso wie andere ASP-Kollektionen besitzt auch die StaticObjects-Kollektion die folgenden Eigenschaften:

Item

Gibt einen Verweis auf ein bestimmtes Element in der Kollektion zurück. Das gewünschte Element kann mit einem Index oder einem Schlüssel angegeben werden.

Key

Gibt den Namen eines bestimmten Elements in der Kollektion zurück. Der Name wird ihm durch das Attribut ID des Tags <OBJECT> zugewiesen. So können Sie beispielsweise den Namen des ersten Elements in der Kollektion wie folgt abrufen:

objElement = Application.StaticObjects.Key(1)

Mit dem Wert der Eigenschaft Key rufen Sie den Wert eines Elements nach seinem Namen ab. Angenommen, das erste Objekt in der StaticObjects-Kollektion heißt MyAdRotator. Mit der folgenden Codezeile setzen Sie dann den Wert der Eigenschaft Border dieses Objekts (bzw. rufen ihn ab):

strKey = Application.StaticObjects.Key(1)
Application.StaticObjects.Item(strKey).Border = 0
Count

Die aktuelle Anzahl der Elemente in der Kollektion.

Weitere Informationen zu den Kollektionseigenschaften Item, Key und Count finden Sie unter Contents-Kollektion weiter oben in diesem Kapitel.

Beispiel
' < FROM GLOBAL.ASA >
' This code resides in the GLOBAL.ASA file at the root
' of the current application. The following <OBJECT>
' tag is processed only once for the current application.
' See Chapter 11 for more details on the GLOBAL.ASA file.

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

' <>

<%
' The following code initializes the AppInfo1 component.
' This initialization code can reside anywhere.
AppInfo1.PersonalName = "Gertrude Stein"
AppInfo1.PersonalAddress = "233 Main Street"

' The following code uses the StaticObjects collection 
' of the Application object to retrieve the value
' of the PersonalName property of AppInfo1. 
For Each objInfo In Application.StaticObjects
%>
   The personal name is <BR>
   <%= Application.StaticObjects(objInfo).PersonalName%><P>
<%
Next
%>

There are <%= Application.StaticObjects.Count %> items
in the Application's StaticObjects collection.
 
Hinweis

Die Kollektion StaticObjects ermöglicht den Zugriff auf ein beliebiges mit einem <OBJECT>-Tag anwendungsweit instantiiertes Objekt. Auf Objekte, die mit der Methode Server. CreateObject instantiiert werden, kann über diese Kollektion nicht zugegriffen werden. Die Nomenklatur ist hier möglicherweise ein wenig verwirrend. Zur Wiederholung: Die Kollektion StaticObjects enthält die Server-Objekte, die mit Hilfe des Tags <OBJECT> und nicht mit Hilfe der Methode CreateObject des Server-Objekts instantiiert wurden.

Aus dem Beispiel für StaticObjects in der Microsoft-Dokumentation zu IIS 4.0 geht hervor, dass Sie, wenn Sie diese Kollektion durchlaufen, auf jede Eigenschaft verweisen können. Dies ist ein wenig missverständlich, da man annehmen könnte, dass die Kollektion tatsächlich alle Eigenschaften des Objekts repräsentiert, anstatt die Objekte selbst. Wenn Sie auf die Eigenschaften oder Methoden von Objekten in der StaticObjects-Kollektion zugreifen möchten, verwenden Sie den Punkt-Operator außerhalb der Klammer um den Schlüssel, gefolgt von dem Namen der Eigenschaft oder Methode, wie im vorigen Beispiel dargestellt.

In der Datei GLOBAL.ASA erzeugte Objekte werden erst wirklich auf dem Server instantiiert, wenn zum ersten Mal eine Eigenschaft oder Methode dieses Objekts aufgerufen wird. Deshalb können Sie erst dann mit der StaticObject-Kollektion auf die Eigenschaften und Methoden dieser Objekte zugreifen, wenn ein anderer Code in Ihrer Anwendung deren Instantiierung auf dem Server ausgelöst hat.

Weisen Sie Objekten, die in Transaktionen mit dem Objekt ObjectContext verwendet werden, keinen anwendungsweiten oder sitzungsweiten Gültigkeitsbereich zu. In Transaktionen verwendete Objekte werden am Ende der Transaktion zerstört und nachfolgende Verweise auf ihre Eigenschaften oder Aufrufe ihrer Methoden erzeugen einen Fehler.

 
Lock  
Application.Lock
 

Die Methode Lock sperrt das Objekt Application, sodass kein anderer Client irgendwelche Variablenwerte in der Contents-Kollektion (nicht nur die vor dem Aufruf der Methode Unlock geänderten Variablen) ändern kann. Die entsprechende Unlock-Methode dient zum Freigeben des Application-Objekts, damit die Werte der Variablen in der Contents-Kollektion wieder von anderen Clients geändert werden können. Falls Sie die Methode Unlock nicht (oder falsch) einsetzen, gibt IIS die Variable zum Abschluss des aktuellen ASP-Skripts oder bei Zeitüberschreitung des Skripts automatisch frei, je nachdem, welches der beiden Ereignisse zuerst eintrifft.

Die Zeitüberschreitung für das ASP-Skript kann mit Microsoft Management Console auf der Seite Eigenschaften der Website angepasst werden. Der Standardwert beträgt 120 Sekunden.

 
Parameter

Keine

 
Beispiel
<%
' This script exists on the second page of a 
' multipage ASP application, so that users may
' or may not visit it. The example shows how you could
' see how many visitors the page has had.
' Assume that TotalNumPage2 starts at 0.

' Lock the Application object.
Application.Lock

intNumVisits = Application.Contents("TotalNumPage2")
intNumVisits = intNumVisits + 1
Application.Contents("TotalNumPage2") = intNumVisits

' Explicitly unlock the Application object.
Application.Unlock

' NOTE: Using the PageCnt.DLL would be a more
' efficient manner of doing this.

%>
<HTML>
<HEAD><TITLE>Home Page</TITLE></HEAD>
<BODY BGCOLOR = #ffffcc>
Welcome to our homepage. You are client number 
<%= Application.Contents("TotalNumPage2")%> to our site. Thank you for your patronage.
</BODY>
</HTML>
 
Hinweis

Jeder mit Ihrem Webserver verbundene Client kann ein Skript aufrufen, das theoretisch in der Lage ist, den Wert einer Variablen in der Kollektion Contents des Objekts Application zu ändern. Deshalb empfiehlt es sich, bei jeder Referenzierung oder Änderung einer Variablen in der Contents-Kollektion die Methoden Lock und Unlock einzusetzen. Dadurch verhindern Sie, dass ein Client den Wert einer Variablen ändert, während ein anderer Client diesen gerade auflöst.

Denken Sie daran, dass Sie keine schreibgeschützte Variable mit einem Aufruf der Methode Lock ohne den entsprechenden Aufruf von Unlock erzeugen können, da IIS das Application-Objekt automatisch freigibt.

In der Ereignisprozedur Application_OnStart müssen Sie die Methoden Lock und Unlock nicht aufrufen (Näheres zum Ereignis Application_OnStart erfahren Sie in der Ereignisreferenz in diesem Kapitel). Das Ereignis Application_OnStart tritt unabhängig von der Anzahl initiierter Sitzungen nur einmal auf. Nur durch die erste Client-Anforderung wird das Ereignis Application_OnStart ausgelöst, und deshalb kann nur dieser Client den Wert dieser bestimmten Application-Variablen ändern. Außerdem wird keine andere Client-Anforderung behandelt, bevor der Application_OnStart-Code nicht fertig abgearbeitet ist.

 
Unlock  
Application.Unlock
 

Die Methode Unlock gibt die Anwendungsvariablen nach einem Aufruf der Methode Lock wieder frei. Nachdem Unlock einmal aufgerufen wurde, können die Werte der Variablen in der Contents-Kollektion des Application-Objekts wieder durch andere Clients geändert werden. Wenn Sie Lock aufrufen, den entsprechenden Aufruf von Unlock aber unterlassen, gibt IIS die Variablen in der Contents-Kollektion des Application-Objekts zum Abschluss des aktuellen ASP-Skripts oder bei Zeitüberschreitung des Skripts automatisch frei, je nachdem, welches der beiden Ereignisse zuerst eintrifft.

 
Parameter

Keine

 
Beispiel

Siehe Beispiel zu Application.Lock.

 
Hinweis

Siehe Hinweis zu Application.Lock.

 
OnEnd  
Application_OnEnd
 

Das Ereignis Application_ OnEnd wird durch das Entladen der ASP-Anwendung selbst aus dem Speicher des Webservers (anhand von Microsoft Management Console) oder durch ein unerwartete Beenden der Anwendung (d. h., wenn der Webdienst auf dem Webserver beendet wird) ausgelöst. Application_OnEnd wird nur einmal pro Anwendung aufgerufen. Der Code für diese Ereignisprozedur befindet sich in der Datei GLOBAL.ASA und wird als letzter Code in der Datei verarbeitet. Wenn Sie hinter anwendungsweiten Variablen "aufräumen“ findet das im Code für das Ereignis Application_OnEnd statt.

 
Parameter

Keine

 
Beispiel
' < FROM GLOBAL.ASA >
' This code resides in the GLOBAL.ASA file at the
' root of the current application. The following
' procedure is processed only once for the current
' application.
' See Chapter 11 for more details on the GLOBAL.ASA file.

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

' This code will run on the server when
' the application stops.
' This code saves the final count of an application
' use counter to a file.
Set filsysObj1 = _
    CreateObject("Scripting.FileSystemObject")
Set tsObj1 = filsysObj1.CreateTextFile("c:\usrcount.txt", _
             True)
tsObj1.WriteLine(Application.Contents("AppUserCount"))
tsObj1.Close

End Sub 
</SCRIPT> 

' <>
 
Hinweis

Die Verwendung des Ereignisses Application_OnEnd ist eine knifflige Angelegenheit. Aus der Microsoft-Dokumentation geht hervor, dass das Ereignis OnEnd ausgelöst wird, wenn keine Sitzungen mehr aktiv sind. Dies ist aber nicht der Fall. OnEnd wird nur ausgeführt, wenn der Webdienst unterbrochen wird oder der Administrator die Anwendung explizit aus dem Speicher des Webservers entfernt (mit MMC). Es kann nicht davon ausgegangen werden, dass dieses Ereignis jemals von der Anwendung aufgerufen wird, sofern Sie nicht direkt eingreifen oder etwas falsch läuft. Auch aus diesem Grund sind vor dem Einsatz von beliebigen anwendungsweiten Variablen die Konsequenzen sorgfältig zu durchdenken.

Mit der Methode MapPath des Objekts Server (Näheres zum Objekt Server siehe Kapitel 9) ist es nicht möglich, relative oder virtuelle Verzeichnisse in der Ereignisprozedur Application_OnEnd einem physischen Verzeichnis zuzuweisen. Microsoft liefert keinen Grund für diese Einschränkung, die aber wahrscheinlich eine Sicherheitsmaßnahme ist.

 
OnStart  
Application_OnStart
 

Das Ereignis Application_OnStart wird beim Erhalt der ersten Client-Anforderung ausgelöst. Application_OnStart wird nur einmal pro Anwendung aufgerufen. Der Code für diese Ereignisprozedur befindet sich in der Datei GLOBAL.ASA und wird vor jedem anderen Code oder jeder Objekt-Instantiierung in der Datei verarbeitet.

 
Parameter

Keine

 
Beispiel
' < FROM GLOBAL.ASA >
' This code resides in the GLOBAL.ASA file at the
' root of the current application. The following
' procedure is processed only once for the current
' application.
' See Chapter 11 for more details on the GLOBAL.ASA file.

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

' This code will run on the server when
' the application starts.
' This code retrieves the last final user count
' and uses it to initialize an Application
' variable.
Set filsysObj1 = CreateObject("Scripting.FileSystemObject")
Set tsObj1 = filsysObj1.OpenTextFile("c:\usrcount.txt", _
             True)
Application.Contents("AppUserCount") = tsObj1.ReadAll
tsObj1.Close

End Sub 
</SCRIPT> 

' <>
 
Hinweis

Sofern vorhanden, ist die Ereignisprozedur Application_OnStart der erste für eine bestimmte ASP-Anwendung auf dem Server ausgeführte Code. Deshalb bietet sie sich optimal für die Initialisierung anwendungsweiter Variablen an. Kein anderer Code in Ihrer ASP-Anwendung wird garantiert ausgeführt.

Setzen Sie anwendungsweite Variablen sehr vorsichtig ein. Jede Variable mit anwendungsweiter Gültigkeit, die Sie im Ereignis Application_OnStart bemessen und initialisieren, belegt bis zum Ende der Anwendung wertvollen Serverspeicher.