Objet Application  

Dans le contexte des pages ASP, une application est la somme de tous les fichiers accessibles via un répertoire virtuel donné et les sous-répertoires qu'il contient. Le contexte d'application ASP se présente de la même manière pour tous les clients qui utilisent l'application. Par exemple, un client en Thaïlande demandant des pages de votre répertoire virtuel /SearchApp accède à la même « application » qu'un second client en Suède demandant des pages du même répertoire virtuel, quelle que soit la page Web spécifique du répertoire à laquelle ces deux clients font appel.

Les applications ASP vous permettent de partager des informations dans une application de la même manière que les applications autonomes traditionnelles. Vous pouvez partager les informations avec tous les clients d'une application ASP donnée en utilisant l'objet Application. Cet objet intégré représente l'application ASP elle-même, et est un objet unique quel que soit le nombre ou le type de clients accédant à l'application, et quelle que soit la partie de l'application que les clients demandent.

L'objet Application est initialisé par IIS dès que le premier client requiert un fichier quelconque du répertoire virtuel donné. Il est conservé en mémoire sur le serveur jusqu'à l'arrêt du service Web ou jusqu'au déchargement explicite de l'application du serveur Web à l'aide de la console de gestion Microsoft Management Console.

IIS vous permet d'instancier les variables et les objets avec une étendue au niveau de l'application. Cela signifie qu'une variable donnée contient la même valeur pour tous les clients de votre application. Vous pouvez également instancier les objets côté serveur avec une étendue au niveau de l'application contenant aussi les mêmes valeurs pour tous les clients. Ces variables et objets au niveau de l'application peuvent être atteints et modifiés depuis le contexte d'une session d'utilisateur quelconque et depuis tout fichier dans l'application en cours.

Comme indiqué précédemment, l'initialisation de l'objet Application se produit lorsque le premier utilisateur de votre application requiert un fichier du répertoire virtuel compris dans l'application ASP. Cette initialisation peut être considérée comme une réserve de mémoire pour l'application ASP donnée. Le serveur Web instancie et initialise l'objet Application pour vous. Toutefois, vous pouvez personnaliser l'initialisation en insérant du code dans un fichier facultatif spécial appelé GLOBAL.ASA. Ce fichier est traité en détail au chapitre 11 ; la présente section ne fournit qu'une présentation générale.

Le fichier GLOBAL.ASA est localisé (s'il existe) à la racine du répertoire physique mappé par le répertoire virtuel de votre application ASP. Il est traité chaque fois qu'un nouvel utilisateur requiert une page du répertoire virtuel de l'application. Le fichier contient le code d'initialisation pour la session de l'utilisateur et pour l'application. S'il ne s'agit pas du premier utilisateur, les sections du fichier GLOBAL.ASA spécifiques à l'application ne sont pas traitées. Si le fichier GLOBAL.ASA n'existe pas ou ne contient pas de code, mais que la requête de l'utilisateur est la première requête du serveur Web demandant des fichiers dans une application donnée, le serveur Web initialise l'objet Application. Toutefois, cette initialisation ne porte que sur la taille de la mémoire requise pour l'application.

Le fichier GLOBAL.ASA fournit un emplacement où vous pouvez créer des variables et des objets avec une étendue de niveau d'application. Cette section du fichier GLOBAL.ASA représente une procédure d'événement. Il s'agit de l'événement OnStart, et le gestionnaire d'événement correspondant s'exécute au lancement de l'application. Il faut noter que le fichier GLOBAL.ASA est traité pour chaque utilisateur qui effectue une requête, mais que l'événement OnStart de l'objet Application est exécuté uniquement pour le premier utilisateur. (La procédure d'événement OnStart et la procédure d'événement OnEnd correspondante sont traitées en plus de détail plus loin dans ce chapitre.)

Les variables et objets avec étendue au niveau de l'application ont toujours la même valeur pour tous les utilisateurs pendant la durée de vie de l'application. Si un utilisateur demande une page contenant du code capable de modifier la valeur d'une variable au niveau de l'application, alors la valeur de cette variable est modifiée pour tous les utilisateurs. Le problème suivant se pose : il est possible que deux utilisateurs ou plus tentent de modifier la valeur de la même variable au même moment. Heureusement, ASP fournit des méthodes de verrouillage/déverrouillage de l'objet Application pour éviter ce type de conflit. Tout comme lors de l'utilisation de variables globales dans une application multithread, vous devez prendre les mêmes précautions lorsque vous utilisez des variables avec étendue au niveau de l'application. Utilisez-les soigneusement.

Les propriétés, collections, méthodes et événements de l'objet Application ASP sont décrits dans le résumé de l'objet Application.

Commentaires/Dépannage  
 
 

Les variables au niveau de l'application sont en réalité des variables globales pour votre application ASP. L'utilisation d'éléments globaux dans les applications ASP doit être considérée avec la même précaution que l'utilisation d'éléments globaux dans les applications autonomes traditionnelles, sinon plus. L'étape la plus importante consiste à évaluer sa portée avant de mettre en œuvre tout objet ou variable avec une étendue au niveau de l'application. En fait, rares sont les instances où vous devez utiliser ces variables globales ASP.

Cela dit, vous devez les utiliser dans certains cas pour créer des applications ASP fonctionnelles. Par exemple, pour maintenir les statistiques spécifiques à l'application pour votre site Web. Ainsi, grâce aux variables au niveau de l'application, augmentant d'une unité au début de chaque session utilisateur, vous pouvez maintenir le compte des clients qui ont utilisé votre application. Les outils de gestion Web, tels que Microsoft Site Server, exécutent des tâches similaires, mais qui sont plus tournées vers les fichiers que vers l'application.

Vous trouverez dans certaines documentations ASP des indications d'utilisation d'objets au niveau de l'application pour la maintenance de connexions de base de données ADO (ActiveX Data Objects) ouvertes pour tous les utilisateurs de l'application. (Pour plus d'informations sur ADO, voir le chapitre 12.) Cela n'est pas une bonne utilisation des variables au niveau de l'application, car cette méthode empêche ODBC de réutiliser les connexions par pages séparées. (Vous pouvez, toutefois, utiliser une variable au niveau de l'application pour maintenir une chaîne de connexion spécifique à l'application pour cette même connexion à la base de données.)

La mise en commun de connexions ODBC fournit une méthode de réutilisation des connexions ODBC par d'autres utilisateurs. Au lieu de créer une connexion à chaque fois qu'un client en requiert une, le serveur s'applique à réutiliser une connexion existante qui n'est plus utilisée. Les connexions ODBC éventuellement en mémoire pendant une certaine période de temps (configurée au niveau de la carte MMC), sont détruites pour libérer de la mémoire.

Toutefois, vous devez tenir compte de la difficulté suivante lorsque vous envisagez d'utiliser des variables et objets au niveau de l'application. Prenez l'exemple suivant. Vous disposez de deux répertoires physiques : c:\inetpub\wwwroot\MainApp et c:\inetpub\wwwroot\MainApp\SearchApp. Ces répertoires sont mappés vers les répertoires virtuels /MainApp et /SearchApp, respectivement. Vous disposez donc d'une application dans une autre application. Le premier client demande une page dans le répertoire physique c:\inetpub\wwwroot\MainApp\SearchApp. Quel sera le code d'initialisation utilisé pour l'objet Application, le code du fichier GLOBAL.ASA du répertoire /MainApp ou celui du fichier GLOBAL.ASA du répertoire /SearchApp ? Dans cet exemple, /SearchApp GLOBAL.ASA est traité. Jusqu'à ce qu'un fichier dans le répertoire /SearchApp/MainApp, n'existant pas dans /SearchApp ne soit demandé, le fichier GLOBAL.ASA du répertoire /MainApp ne sera pas traité. Si les deux fichiers GLOBAL.ASA définissent différents ensembles de variables au niveau de l'application, vous ne pouvez pas identifier depuis votre code les variables d'application correctement initialisées sans les tester.

Enfin, notez que IIS vous autorise désormais à définir des applications ASP dans différents espaces de mémoire d'application et de serveur Web en sélectionnant une option dans le panneau Propriétés d'un répertoire virtuel donné sur la console de gestion Microsoft Management Console d'IIS. Cela représente une amélioration considérable dans IIS. Si votre application ASP s'exécute dans un espace de mémoire distinct du serveur Web, et qu'un objet de serveur (ou le moteur de script) subit une panne, le serveur Web ou les autres applications ASP n'en souffriront pas.

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

La collection Contents de l'objet Application contient les variables à étendue au niveau de l'application et les objets ajoutés à l'application en cours à l'aide de scripts (non pas à l'aide de la balise <OBJECT>).

Avant de vous pencher sur la procédure d'ajout des éléments à la collection Contents, vous devez comprendre les propriétés de la collection. La collection Contents comprend trois propriétés :

Item

Extrait la valeur d'un membre spécifique de la collection Contents. Vous spécifiez ce membre à l'aide d'une clé de type chaîne (dont vous pouvez obtenir la valeur en utilisant l'index de la propriété Key, comme expliqué plus loin dans cette section) ou d'un numéro d'index. Par exemple, si vous souhaitez initialiser un élément dans la collection Contents avec la valeur Pi, vous utilisez une ligne de code similaire à la suivante :

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

Dans cette ligne de code, l'élément recherché dans la collection est spécifié à l'aide de la valeur Pi. Ainsi, vous pouvez alors extraire la valeur de cet élément de la collection Contents à l'aide de la ligne de code suivante :

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

Pour des raisons qui sont expliquées plus loin, supposez qu'il s'agit du premier élément ajouté à la collection Contents.

Vous pouvez également extraire la valeur d'un élément dans la collection Contents à l'aide de son index dans la collection plutôt que d'une clé, comme indiqué dans la ligne de code suivante :

dblMyVar = Application.Contents.Item(1)

Notez l'utilisation du chiffre 1 (un), pas zéro, pour représenter le premier élément dans la collection Contents. Ce détail est important, car si vous utilisez un zéro dans cette ligne de code, la variable dblMyVar sera initialisée avec une valeur indéterminée. Malheureusement, une erreur ne survient pas. Vous obtenez seulement une variable incorrectement initialisée :

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

Item est la propriété par défaut de la collection Contents, tout comme la collection Contents est la collection par défaut de l'objet Application. Cela signifie que les trois lignes de code suivantes sont interprétées exactement de la même manière dans votre application :

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

De la même manière, vous supposez que les trois lignes de code suivantes sont également équivalentes :

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

Toutefois, cela n'est le cas que si le premier élément dans la collection Contents a déjà été défini à l'aide d'une clé. Bien que ce détail ne soit pas mentionné dans la documentation accompagnant le produit ASP, vous devez définir l'élément à l'avance à l'aide d'une clé pour pouvoir utiliser l'une des deux lignes de code précédentes. Par exemple, supposez que vous voulez ajouter un second élément à la collection Contents. Vous ne pouvez pas initialiser cet élément à l'aide de l'une des deux lignes de code suivantes :

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

Toutefois, il existe une exception à cette exception. Vous pouvez utiliser le code suivant pour initialiser la seconde variable :

Application(2) = 3.14159

Vu ces incohérences, assurez-vous de toujours utiliser une clé plutôt qu'un index lorsque vous référencez la valeur d'un élément spécifique dans la collection Contents.

De même, il est important d'utiliser une clé lorsque vous faites référence à un membre spécifique de la collection Contents, car l'index de ce membre risque de changer. Par exemple, supposez que votre application contienne le code suivant :

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

Supposant que ces variables sont les trois premières ajoutées à la collection Contents, vous pouvez plus tard utiliser leur index pour y faire référence :

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

Toutefois, si vous utilisez la méthode Remove, laquelle supprime définitivement une variable de la collection (voir plus loin dans ce chapitre), pour supprimer la variable strMiddleName, les numéros d'index seront modifiés :

Session.Contents.Remove("strMiddleName")

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

Représente le nom d'un élément spécifique de la collection Contents. Souvenez-vous, comme indiqué précédemment, que chaque valeur d'élément est représentée par la propriété Item. De même, le nom de chaque élément est représenté par sa propriété Key.

Si vous ne connaissez pas le nom d'une clé spécifique, vous pouvez l'obtenir à partir de son numéro. Par exemple, supposez que vous recherchiez le nom de clé du troisième élément dans la collection, afin d'en extraire sa valeur par la suite. Vous pouvez utiliser le code suivant :

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

Représente le nombre total d'éléments dans la collection Contents.

 
Remarques

Vous pouvez initialiser des variables au niveau de l'application et ajouter ainsi des éléments à la collection Contents de deux manières. En premier lieu, vous pouvez initialiser des variables Application dans la procédure d'événement Application_OnStart du fichier GLOBAL.ASA, comme indiqué à l'exemple 4.1.

Initialisation de variables au niveau de l'application dans GLOBAL.ASA

' < 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

Le code dans l'exemple 4.1 permet de créer trois variables d'étendue application, ajoutant ainsi trois éléments à la collection Contents. Notez que ces variables seront instanciées et initialisées uniquement au démarrage de l'application, et non à chaque visite au site des utilisateurs qui suivent. Ces variables conservent les mêmes valeurs sauf si un autre script les modifie pour toutes les pages et tous les utilisateurs.

Le code précédent ajoute des éléments à la collection Contents à l'aide d'une clé. Vous pouvez également ajouter des éléments à la collection à l'aide d'une valeur de type index, comme dans cet exemple :

Application.Contents(1) = "California"

Toutefois, vous devez ajouter des éléments à une collection à l'aide d'une clé ou d'un index, mais pas des deux. Si vous ajoutez des éléments à l'aide des deux méthodes, les éléments avec une clé remplaceront les éléments de position inférieure auxquels vous n'avez pas attribué de clé.

Vous pouvez également créer des variables d'étendue application et par la même occasion ajouter des éléments à la collection Contents à l'intérieur de tout script sur toute page. Toutefois, notez que les variables ainsi créées sont créées et maintenues sur l'application entière et sur tous les utilisateurs. L'exemple 4.2 illustre cette méthode d'initialisation de variables d'étendue application.

Initialisation de variables au niveau de l'application dans un script côté serveur

<%
' 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"

%>

Le code dans l'exemple 4.2 ajoute trois autres variables d'étendue application à l'application. Notez que ces variables seront réinitialisées chaque fois qu'un utilisateur demande la page contenant ce code. Pour éviter cette perte de ressources au niveau du processeur, envisagez d'exécuter cette initialisation à l'aide de code similaire à celui indiqué ci-dessous :

<%
' 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

%>

Ce code permet de créer une septième variable d'application pour l'application en cours uniquement si elle n'a pas déjà été créée.

La collection Contents prend en charge les constructions For Each et For...Next pour l'itération de la collection, comme indiqué à l'exemple 4.3 .

Utilisation de l'élément For Each avec la collection Contents

<%
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 %>

Notez, toutefois, que contrairement à la plupart des objets de collection, la collection Contents ne prend pas en charge la méthode Add, et que jusqu'à la version IIS 5.0, elle ne prenait pas en charge la méthode Remove. Si elles ne sont pas explicitement supprimées, les variables auxquelles vous attribuez une étendue application restent en résidence jusqu'à l'arrêt du serveur Web ou la temporisation de la dernière session utilisateur.

Si vous ajoutez un objet à la collection Contents de l'application, assurez-vous que le modèle de thread pour l'objet prend en charge son utilisation dans une étendue. Il est recommandé d'utiliser le modèle de thread libre. Pour plus de détails sur l'utilisation des différents modèles de thread dans les composants de serveur IIS, consultez l'ouvrage de Shelley Powers, Developing ASP Components, publié par O'Reilly & Associates.

Les applications avec modèle de thread libre autorisent plusieurs processus utilisateur à accéder simultanément à la même instance du composant.

Pour accéder aux propriétés ou méthodes d'un objet à étendue application, utilisez une extension de la syntaxe indiquée précédemment pour accéder à la valeur d'une variable à étendue application, comme illustré dans le fragment de code suivant :

' 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")

Si vous envisagez d'utiliser un objet donné dans une transaction utilisant l'objet ObjectContext, n'attribuez pas une étendue application ou session à cet objet. Les objets utilisés dans les transactions sont détruits à la fin de la transaction et toute référence ultérieure à leurs propriétés ou appels à leurs méthodes entraîneront une erreur.

Lorsque vous ajoutez un tableau à la collection Contents de l'objet Application, il est recommandé d'ajouter le tableau entier comme une seule entité. Lorsque vous modifiez un élément dans le tableau, extrayez une copie du tableau, modifiez l'élément, puis ajoutez le tableau à la collection Contents en entier de nouveau. Le code dans l'exemple 4.4 illustre cette technique.

Utilisation des tableaux dans la collection Contents

<%
' 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(Key|Index)
 

Supprime un membre spécifique de la collection Contents. De plus, dans IIS 5.0, la méthode Remove vous permet de supprimer de la mémoire une variable spécifique de la collection Contents de l'application, sans pour autant supprimer les autres variables.

 
Paramètres
Key

Une variable de chaîne indiquant le nom du membre spécifique de la collection Contents à supprimer.

Index

Une variable d'entier indiquant l'index du membre spécifique de la collection Contents à supprimer.

 
Exemple

Le script suivant supprime deux membres de la collection Contents :

<%
' 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")
.
.
.
%>
 
Remarques

La méthode Remove représente un atout majeur dans la collection Contents, car elle permet de mieux contrôler et nettoyer la mémoire. Vous pouvez supprimer de la mémoire certains éléments de la collection sans quitter la session utilisateur. Comme mentionné précédemment dans la section de la propriété Item de la collection Contents, il est important d'utiliser une clé de type chaîne au lieu d'un index lorsque vous appelez la méthode Remove. L'index d'un élément risque de changer pendant la durée de vie de l'application, entraînant des résultats inattendus lorsque vous appelez la méthode Remove en utilisant une valeur d'index stockée.

La méthode Remove de la collection Contents de l'application vous permet de supprimer des membres de la collection Contents, sans décharger l'application Web entière, via l'interface d'administration du serveur Web IIS. L'absence de cette fonction dans les versions antérieures à IIS 5.0 était une source de difficultés de gestion des variables à étendue application.

 
RemoveAll  
Application.Contents.RemoveAll
 

Supprime tous les membres de la collection Contents. De plus, dans IIS 5.0, la méthode RemoveAll vous permet de supprimer de la mémoire toutes les variables à étendue application sans décharger l'application.

 
Paramètres

Aucun

 
Exemple

Le script suivant supprime tous les membres de la collection Contents :

<%
' 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
.
.
.
%>
 
Remarques

Comme la méthode Remove, la méthode RemoveAll représente un atout majeur dans la collection Contents, car elle permet de mieux contrôler et nettoyer la mémoire. Elle permet de supprimer toutes les variables à étendue application sans décharger l'application.

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

La collection StaticObjects contient tous les objets ajoutés à l'application à l'aide de la balise <OBJECT>. Vous pouvez utiliser la propriété Item (traitée plus loin) de la collection StaticObjects pour extraire les propriétés d'un objet spécifique dans la collection. Vous pouvez également utiliser cette propriété de la collection StaticObjects pour accéder à une méthode spécifique d'un objet donné dans la collection.

Vous pouvez ajouter des objets à cette collection uniquement en utilisant la balise <OBJECT> du fichier GLOBAL.ASA, comme indiqué dans l'exemple suivant :

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

Vous ne pouvez pas ajouter d'objets à cette collection ailleurs dans votre application ASP.

La collection StaticObjects, comme les autres collections ASP, a les propriétés suivantes :

Item

Renvoie une référence à un élément spécifique dans la collection. Pour spécifier un élément, vous pouvez utiliser un numéro d'index ou une clé.

Key

Renvoie le nom d'un élément spécifique dans la collection ; ce nom est attribué par l'attribut ID de la balise <OBJECT>. Par exemple, vous pouvez recevoir le nom du premier élément dans la collection sous la forme suivante :

objElement = Application.StaticObjects.Key(1)

Utilisez la valeur de la propriété Key pour extraire la valeur d'un élément par son nom. Par exemple, supposez que le premier objet dans la collection StaticObjects soit nommé MyAdRotator. Vous pouvez alors utiliser la ligne de code suivante pour définir (ou extraire) la valeur de la propriété Border de cet objet :

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

Le nombre actuel d'éléments dans la collection.

Pour plus d'informations sur les propriétés Item, Key et Count d'une collection, voir Collection Contents, plus haut dans le présent chapitre.

Exemple
' < 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.
 
Remarques

La collection StaticObjects vous permet d'accéder à tout objet instancié avec étendue au niveau de l'application à l'aide une balise <OBJECT>. Les objets instanciés en utilisant la méthode de serveur CreateObject ne sont pas accessibles via cette collection. La nomenclature ici peut prêter à confusion. En résumé : la collection StaticObjects contient les objets serveur instanciés via l'utilisation de la balise <OBJECT>, et non via la méthode CreateObject de l'objet Server.

L'exemple StaticObjects dans la documentation IIS 4.0 de Microsoft suggère que si vous itérez à travers cette collection, vous pourrez référencer chaque propriété. Cette information est quelque peu inexacte, car elle suggère que la collection représente toutes les propriétés des objets plutôt que les objets eux-mêmes. Si vous voulez accéder aux propriétés ou aux méthodes des objets dans la collection StaticObjects, vous devez utiliser l'opérateur point, en dehors des parenthèses autour de la propriété Key, suivi du nom de la propriété ou de la méthode, comme indiqué dans l'exemple précédent.

Les objets créés dans le fichier GLOBAL.ASA ne sont pas réellement instanciés sur le serveur jusqu'au ce qu'un premier appel à une propriété ou à une méthode de cet objet soit effectué. Par conséquent, la collection StaticObjects ne peut pas être utilisée pour accéder à ces propriétés et méthodes d'objets jusqu'à ce qu'un autre code dans votre application entraîne leur instanciation sur le serveur.

N'attribuez pas d'étendue application ou session à un objet utilisé dans une transaction avec l'objet ObjectContext. Les objets utilisés dans les transactions sont détruits à la fin de la transaction et toutes les références ultérieures à leurs propriétés ou appels à leurs méthodes entraîneront une erreur.

 
Lock  
Application.Lock
 

La méthode Lock verrouille l'objet Application, empêchant tout autre client d'apporter des modifications aux valeurs des variables dans la collection Contents (il ne s'agit pas ici seulement des variables que vous modifiez avant d'appeler la méthode Unlock). La méthode Unlock correspondante est utilisée pour libérer l'objet Application afin que d'autres clients puissent de nouveau modifier les valeurs de variables de la collection Contents. Si vous n'utilisez pas la méthode Unlock, IIS déverrouille automatiquement la variable à la fin du script Active Server Pages en cours ou au moment de la temporisation du script, si celle-ci se produit avant.

La temporisation du script ASP est réglable à travers la page Properties du site Web à l'aide de la console de gestion Microsoft Management Console. La valeur par défaut est de 120 secondes.

 
Paramètres

Aucun

 
Exemple
<%
' 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>
 
Remarques

Tout client connecté à votre serveur Web peut appeler un script capable de modifier la valeur d'une variable dans la collection Contents de l'application. Par conséquent, il est judicieux d'utiliser les méthodes Lock et Unlock chaque fois que vous faites une référence à ou que vous modifiez une variable dans la collection Contents. Cela évite toute éventualité de tentative de modification de la valeur d'une variable par un client, alors qu'un autre client est en train de résoudre cette même valeur de variable.

Gardez à l'esprit que vous ne pouvez pas créer une variable en lecture seule en utilisant un appel à la méthode Lock sans un appel correspondant à la méthode Unlock, car IIS déverrouille automatiquement l'objet Application.

Vous n'êtes pas obligé d'appeler les méthodes Lock et Unlock dans la procédure d'événement Application_OnStart (voir les références sur les événements dans ce chapitre pour plus d'informations sur l'événement Application_OnStart). L'événement Application_OnStart se produit une seule fois, quel que soit le nombre de sessions éventuellement initiées. La première requête du client est la seule à déclencher l'événement Application_OnStart. Par conséquent, ce client est le seul à pouvoir modifier la valeur de la variable d'application spécifique. De plus, aucune autre requête de client ne sera traitée jusqu'à la fin du code Application_OnStart.

 
Unlock  
Application.Unlock
 

La méthode Unlock libère les variables d'application d'un appel de méthode Lock. Une fois la méthode Unlock appelée, les autres clients peuvent de nouveau modifier les valeurs des variables dans la collection Contents de l'application. Si vous appelez la méthode Lock, et que vous n'appelez pas la méthode Unlock correspondante, IIS déverrouille automatiquement les variables dans la collection Contents de l'application à la fin de la page ASP active ou au moment de la temporisation du script, si celle-ci se produit la première.

 
Paramètres

Aucun

 
Exemple

Voir l'exemple concernant Application.Lock.

 
Remarques

Voir les remarques concernant Application.Lock.

 
OnEnd  
Application_OnEnd
 

L'événement Application_ OnEnd est déclenché au moment du déchargement de l'application ASP du serveur Web (à l'aide de la console de gestion Microsoft Management Console) ou lorsque l'application est accidentellement arrêtée (par exemple, si le service Web est interrompu sur le serveur Web). L'événement Application_OnEnd n'est appelé qu'une seule fois par application. Le code correspondant à cette procédure d'événement est localisé dans le fichier GLOBAL.ASA, et il est le dernier à être traité, après tout autre code présent dans le fichier. C'est dans le code de l'événement Application_OnEnd que vous effectuez le nettoyage après toute variable à étendue application.

 
Paramètres

Aucun

 
Exemple
' < 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>

' <>
 
Remarques

L'utilisation de l'événement Application_OnEnd est délicate. La documentation de Microsoft suggère que l'événement OnEnd est déclenché lorsqu'il ne reste plus de sessions actives. Cela n'est pas toujours le cas. L'événement OnEnd s'exécute uniquement lorsque le service Web est interrompu ou lorsque l'administrateur décharge explicitement l'application depuis la mémoire du serveur Web (en utilisant la carte MMC). Vous ne pouvez pas être sûr que cet événement ne sera pas appelé depuis votre application accidentellement ou sans intervention directe de votre part. Aussi, vous devez considérer avec soin toutes les implications possibles avant d'utiliser les différentes variables au niveau de l'application.

Vous ne pouvez pas utiliser la méthode MapPath de l'objet Server (voir le chapitre 9 pour plus d'informations sur l'objet Server) pour mapper un répertoire relatif ou virtuel à un répertoire physique au sein de la procédure d'événement Application_OnEnd. Microsoft n'indique pas la raison de cette limitation qui pourrait émaner du domaine de la sécurité.

 
OnStart  
Application_OnStart
 

L'événement Application_OnStart est déclenché lorsque la première requête du client est reçue. L'événement Application_OnStart n'est appelé qu'une seule fois par application. Le code correspondant à cette procédure d'événement est localisé dans le fichier GLOBAL.ASA, et il est le premier à être traité, avant tout autre code ou instanciation d'objet, présent dans le fichier.

 
Paramètres

Aucun

 
Exemple
' < 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>

' <>
 
Remarques

La procédure d'événement Application_OnStart, si elle est présente, est le premier code exécuté sur le serveur pour une application Active Server Pages donnée. Par conséquent, il s'agit du meilleur emplacement pour initialiser les variables au niveau de l'application. L'exécution d'un autre code dans votre application ASP n'est pas garantie.

Considérez soigneusement l'utilisation de variables au niveau de l'application. Chaque variable avec étendue d'application que vous configurez et initialisez dans l'événement Application_OnStart continue à occuper de la mémoire sur le serveur jusqu'à la fin de l'application.