GLOBAL.ASA  

GLOBAL.ASA ファイルは、セッションまたはアプリケーションスコープを持つオブジェクト、変数、およびイベントハンドラ (具体的には、Application オブジェクトと Session オブジェクトの OnStart イベントプロシージャと OnEnd イベントプロシージャ用) を宣言する場所です。仮想ディレクトリまたは ASP アプリケーションごとに 1 つの GLOBAL.ASA ファイルしか設定できません。たとえば、/Search 仮想ディレクトリ内のすべてのスクリプトから構成される Search ASP アプリケーションがあるとします。この仮想ディレクトリ内には、1 つの GLOBAL.ASA ファイルしか設定できず、そのファイルはディレクトリのルート (/Search) にある必要があります。2 番目の GLOBAL.ASA ファイルが /Search の任意のサブディレクトリのどこかにあっても、ASP.DLL では無視されます。

GLOBAL.ASA ファイルは、表示可能なコンテンツを保持できません。このようなコンテンツは ASP.DLL では無視されます。スクリプトを <SCRIPT> タグで囲んでいない場合、セッションまたはアプリケーションレベルのスコープをサポートしていないサーバーコンポーネントをインスタンス化するときと同様に、エラーが発生します。最後に、このファイルには GLOBAL.ASA という名前を付ける必要があり、ASP アプリケーションを構成する仮想ディレクトリのルート以外の場所に置くことはできません。他のスクリプトと同様、GLOBAL.ASA ファイル内の任意のサポートされているスクリプト言語を使用でき、共通の <SCRIPT>...</SCRIPT> タグセット内で同じ言語を使用するイベントプロシージャをグループ化できます。

本章の GLOBAL.ASA ファイルの項では、次のトピックについて説明します。

    アプリケーションオブジェクトイベントおよびアプリケーションスコープ

    セッションオブジェクトイベントおよびセッションスコープ

    タイプライブラリの宣言

GLOBAL.ASA:コメントおよびトラブルシューティング  
 
 

アプリケーションの GLOBAL.ASA ファイルに対して変更を行うと、Web サーバーでは、GLOBAL.ASA ファイルを再コンパイルする前に、指定されたアプリケーションに対する現在のすべての要求を完了します。Microsoft によると、いったん現在の要求が処理されると、このファイルは再コンパイルされ、現在のアプリケーション内で開始された新しいセッションにより、GLOBAL.ASA ファイルコードの処理がトリガされます。この再コンパイル実行中、サーバーは、アプリケーション内のスクリプトに対する新しい要求をすべて無視します。残念ながら、上記の事項は実際には、Personal Web Server、IIS 3.0、および IIS 4.0 では機能しません。新しい GLOBAL.ASA の処理前に、マシンのリブートが強制されます。

この間実行中のセッションは、GLOBAL.ASA に対する変更の影響を受けません。Web サーバーが GLOBAL.ASA ファイルの再コンパイルを完了すると、アクティブなセッションはすべて削除され、新しい GLOBAL.ASA ファイル内の Session_OnEnd と Application_OnEnd のイベントプロシージャが呼び出されます。ユーザーは、新しいセッションを開始するため、Web アプリケーション内で新しい要求を作成する必要があります。新しいすべてのセッションは、新しい GLOBAL.ASA ファイルの処理と共に開始します。

独自の GLOBAL.ASA ファイルを開発する際の重要な考慮事項は、サーバーサイドインクルードを使用してファイルに指定した任意のコードを変更しても、Web サーバーは GLOBAL.ASA ファイルを再コンパイルしないことです。再コンパイルをトリガするには、GLOBAL.ASA ファイルを変更していない場合でも、このファイルを実際に再保存する必要があります。

GLOBAL.ASA ファイルには、プロシージャと関数を含めることができます。ただし、これらのプロシージャを呼び出せるのは、Session_OnStart、Session_OnEnd、Application_OnStart、および Application_OnEnd のイベントプロシージャだけです。これらのプロシージャはすべて、GLOBAL.ASA ファイルにしか配置できません。これらの関数やプロシージャをアプリケーションの他のファイルで使用する場合、呼び出すスクリプトを保持しているサーバーサイドインクルードファイルの使用を検討する必要があります。

最後に、Web アプリケーション内の他のすべてのスクリプトと同様に、Windows NT のセキュリティを使用して、GLOBAL.ASA ファイルの安全を確保する必要があります。そうでない場合は、クライアントからこのファイルへのアクセスが可能になります。GLOBAL.ASA にはアプリケーションのセキュリティ関連コードがしばしば含まれていることを考慮すると、この注意は非常に重要です。

アプリケーションオブジェクトイベントおよびアプリケーションスコープ  
<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>

GLOBAL.ASA ファイルでは、Application オブジェクトの OnStart と OnEnd の 2 つのイベントに対するイベントプロシージャコードを指定できます。これら 2 つのイベントがトリガされるのは、それぞれ最初のクライアントがアプリケーション内のページを要求した時点、およびアプリケーション内の最後のユーザーセッションが終了した時点です。これらのイベントの詳細については、第 4 章を参照してください。本章では、第 4 章で説明されている一部のトピック、およびそれらのトピックと GLOBAL.ASA ファイルやその使用方法との関連について繰り返し説明します。

「Application オブジェクト」の章で説明されている情報を確認すると、ASP アプリケーションは、仮想ディレクトリ内のすべてのファイル、およびその仮想ディレクトリ下のサブフォルダ内のすべてのファイルから構成されていることになります。変数またはオブジェクトにアプリケーションスコープがある場合、アプリケーションの現在のすべてのユーザーに対して同じ値を保持し、任意のユーザーがアプリケーションスコープの変数またはオブジェクトの値を変更できます。このような変更は、それ以降任意のユーザーが表示する値に反映されます。

 
パラメータ
strLangEngine

有効なサーバー側のスクリプトエンジンの名前を表す文字列です。このエンジンは、IIS Web サーバーではデフォルトで VBScript ですが、JScript、PerlScript、Python、REXX、または IIS スクリプトコンテキストをサポートしている他の任意のスクリプトエンジンを使用できます。

 
[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>
 
メモ

GLOBAL.ASA ファイルで一般的に留意する事項、および特に Application イベントプロシージャで留意する事項がいくつかあります。最初に、GLOBAL.ASA ファイルを保持しなければならない理由はないということが挙げられます。このファイルなしでも、ASP アプリケーションは完全に正常に機能します。実際に、GLOBAL.ASA ファイルがなければ、ASP アプリケーションで最初に要求されたページへのアクセス速度は速くなります。GLOBAL.ASA を実行してから、要求されたスクリプトを実行するのは、常に要求されたスクリプトだけを実行するより遅くなるからです。

次に、GLOBAL.ASA ファイルがある場合、独自の Application_OnEnd イベントプロシージャのコードを作成する実際上の必要性がないことが挙げられます。Web サーバー自身が、アプリケーションの最後にアプリケーションスコープのオブジェクトと変数に使用されていたメモリを解放するからです。ただし、特定アプリケーションの実行時に固有の情報をデータベースなどに保存する場合、Application_OnEnd イベントプロシージャでこのコードを作成できます。たとえば、アプリケーションレベルのページカウンタ変数を作成し、その値をアプリケーションの最後にテキストファイルに記録し、次回アプリケーションのファイルが要求され、アプリケーションが再起動されたときに使用できます。この操作を実行するには、他にもより適切な方法があることに注意してください。

Application オブジェクトのイベントプロシージャに関する追加メモについては、第 4 章を参照してください。

 
セッションオブジェクトイベントおよびセッションスコープ  
<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>

GLOBAL.ASA ファイルでは、Session オブジェクトの OnStart と OnEnd の 2 つのイベントに対するイベントプロシージャコードを指定できます。これら 2 つのイベントがトリガされるのは、それぞれ最初にクライアントがアプリケーション内のページを要求した時点、およびユーザーセッションが終了した時点 (デフォルトでは、ユーザーの最後の要求から 20 分後) です。これらのイベントの詳細については、第 10 章を参照してください。本章では、第 10 章で説明されている一部のトピック、およびそれらのトピックと GLOBAL.ASA ファイルやその使用方法との関連について繰り返し説明します。

 
パラメータ
strLangEngine

有効なサーバー側のスクリプトエンジンの名前を表す文字列です。このエンジンは、IIS Web サーバーではデフォルトで VBScript ですが、JScript、PerlScript、Python、REXX、または IIS スクリプトコンテキストをサポートしている他の任意のスクリプトエンジンを使用できます。

 
[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>
 
メモ

Session オブジェクトのイベントプロシージャに関するメモについては、第 10 章を参照してください。

 
タイプライブラリの宣言  
<!-- METADATA TYPE="TypeLibrary"
FILE="FileName"
UUID="TypeLibraryUUID"
VERSION="MajorVersionNumber.MinorVersionNumber"
LCID="LocaleID"
-->
 
<!-- METADATA TYPE="TypeLibrary"
FILE="FileName"
UUID="TypeLibraryUUID"
VERSION="MajorVersionNumber.MinorVersionNumber"
LCID="LocaleID"
-->

タイプライブラリは、COM オブジェクトのプロパティとメソッドに関する情報を保持するアクセサリファイルです。これらのファイルは、オブジェクトが使用する定数、および許容可能なプロパティ値のデータタイプを記述します。タイプライブラリを使用すると、アプリケーションでは、タイプライブラリが対応するオブジェクトの使用時の エラーをより正確に報告できます。オブジェクトの DLL で定義されている定数を使用することもできます。これにより、オブジェクトのコードの複雑さが大幅に低減され、すべてのオブジェクトに対して保守が困難なサーバーサイドインクルードを作成し使用しなくても、コードの読みやすさと再利用性が増大します。

ご存知のように、GLOBAL.ASA ファイル内のアプリケーションスコープのオブジェクトとセッションスコープのオブジェクトをインスタンス化できます。これらの任意のオブジェクトに対応するタイプライブラリがある場合、アプリケーションの GLOBAL.ASA ファイルでその使用を宣言できます。

 
パラメータ
FileName

該当するオブジェクトのタイプライブラリファイルの完全物理パス (仮想パスではない) およびファイル名です。FileName パラメータと TypeLibraryUUID パラメータを TypeLibrary 宣言に指定すると、Web サーバーは、ファイル名を使用してタイプライブラリを識別します。FileName または TypeLibraryUUID のいずれかを指定する必要があります。

TypeLibraryUUID

タイプライブラリの普遍的な一意の識別番号です。これは COM オブジェクトの UUID とは異なり、HKEY_CLASSES_ROOT\TypeLib のサブキーとしてレジストリ内に定義されます。FileName パラメータと TypeLibraryUUID パラメータを TypeLibrary 宣言に指定すると、Web サーバーは、ファイル名を使用してタイプライブラリを識別します。FileName または TypeLibraryUUID のいずれかを指定する必要があります。

MajorVersionNumber

タイプライブラリのメジャーバージョン番号です。このオプションのパラメータを指定して、Web サーバーで正しいメジャーバージョン番号のファイルを検索できない場合、Web サーバーはエラーを生成します。MajorVersionNumber を指定する場合、MinorVersionNumber パラメータも指定する必要があります。

MinorVersionNumber

タイプライブラリのマイナバージョン番号です。このオプションのパラメータを指定して、Web サーバーで正しいマイナバージョン番号のファイルを検索できない場合、Web サーバーはエラーを生成します。MinorVersionNumber を指定する場合、MajorVersionNumber パラメータも指定する必要があります。

LocaleID

各タイプライブラリは、異なるロケールをサポートできます。LocaleID パラメータは、このタイプライブラリに使用するロケールを表します。タイプライブラリにこのロケールがない場合、Web サーバーはエラーを生成します。TypeLibrary 宣言の VERSION パラメータと同様に、このパラメータはオプションです。

 
[Excerpt from GLOBAL.ASA]

<!-- METADATA TYPE="TypeLibrary"
FILE="Report.LIB"
VERSION="1.5"
LCID="1306"
-->
 
メモ

このコードは、バージョン 1.5 の Report COM オブジェクトのタイプライブラリの使用を宣言しています。使用する LCID はフランス語の LCID です。バージョン 1.5 のこの COM オブジェクトのタイプライブラリがないか、タイプライブラリでフランス語用の LCID 1306 がサポートされていない場合、エラーが発生します。

ASP アプリケーション内からタイプライブラリを使用する場合、実際には折り返しでカプセル化したタイプライブラリのバージョンを使用することになります。IIS では、背景でタイプライブラリに対してこの折り返しを作成します。

コーディングスタイルとしては、Microsoft では、タイプライブラリの宣言を GLOBAL.ASA ファイルの先頭近くに指定することを推奨しています。ただし、ファイルの他の場所に置いても影響は認められませんでした。また、TypeLibrary 宣言を <SCRIPT> タグの外部に配置する必要はありません。

1 つの ASP アプリケーションの複数の COM オブジェクトからタイプライブラリを使用する際の問題の 1 つに、オブジェクト内の定数の冗長性があります。特に、その COM オブジェクトが異なるデベロッパーによって作成されている場合にそれが当てはまります。この冗長性を回避するには、定数を参照する際、COM オブジェクト自身の名前を定数名の接頭辞として使用します。たとえば、ADODB タイプライブラリの adStoredProcedure 定数は、ADODB.adStoredProcedure として参照できます。

最後に、タイプライブラリを不正に宣言した場合、 Web サーバーから次の表に示すエラーのいずれかが返される可能性があります。

エラーコード

説明

ASP 0222

タイプライブラリの宣言が無効です。

ASP 0223

タイプライブラリが存在しません。たとえば、METADATA タグ内に指定したタイプライブラリが存在しない場合、このようなエラーが発生します。

ASP 0224

宣言したタイプライブラリがうまく見つかった場合でも、そのライブラリを何らかの不明な理由で読み込むことができません。

ASP 0225

何らかの理由で、Web サーバーが、METADATA タグ内に宣言したタイプライブラリの折り返しを作成できません。