Global.asa 檔案是一個可選檔案,使用者可以在該檔案中指定事件指令碼,並聲明具有會話和Application 領域的對象。該檔案的內容
給使用者顯示的,而是用來儲存事件資訊和由應用程式全域使用的對象。該檔案的名稱必須是 Global.asa 且必須存放在應用程式的
根目錄中。每個應用程式只能有一個 Global.asa 檔案。
Global.asa 檔案只能包含如下內容:
1.應用程式事件
2.會話事件
3.<OBJECT> 聲明
TypeLibrary 聲明
如果包含的指令碼沒有用 <SCRIPT> 標記封裝,或定義的對象沒有會話或Application 領域,則伺服器將返回錯誤。伺服器會忽略已標
記的但未被應用程式或會話事件使用的指令碼以及檔案中的 HTML 語句。
可以用任何支援指令碼的語言編寫 Global.asa 檔案中包含的指令碼。如果多個事件使用同一種指令碼語言,就可以將它們組織在一組
<SCRIPT> 標記中。
當使用者儲存對 Global.asa 檔案所做的更改時,在重新編譯 Global.asa 檔案之前,伺服器會結束處理當前應用程式的所有請
求。在此期間,伺服器拒絕其他請求並返回一個錯誤訊息,說明正在重啟動應用程式,不能處理請求。
當使用者當前的所有請求處理完之後,伺服器對每個會話調用 Session_OnEnd 事件,刪除所有活動會話,並調用
Application_OnEnd 事件關閉應用程式,然後編譯 Global.asa 檔案。接下來,使用者的請求將啟動應用程式並建立新的會話,觸
發 Application_OnStart 和 Session_OnStart 事件。
但是,儲存 Global.asa 檔案中所包含的檔案的更改並不能使伺服器重新編譯 Global.asa。為了讓伺服器識別包含檔案的改動,
必須再儲存一下 Global.asa 檔案。
在 Global.asa 檔案中聲明的過程只能從一個或多個與 Application_OnStart、Application_OnEnd、Session_OnStart 和
Session_OnEnd 事件相關的指令碼中調用。在基於 ASP 的應用程式中的 ASP 頁中,它們是停用。
要在應用程式之間共用過程,可在單獨的檔案中聲明這些過程,然後使用伺服器端的包含 (SSI) 語句將該檔案包含在調用該過程
的 ASP 頁中。通常,包含檔案的副檔名應為 .inc。
基於 ASP 的應用程式由在其根目錄及其子目錄中所有檔案組成。應用程式在使用者首次開啟應用程式中的某一 Web 頁時啟動,在服
務器關閉時終止。應用程式有兩個事件,即 Application_OnStart 事件和 Application_OnEnd 事件。
使用者可以在 Global.asa 檔案中為這些事件指定指令碼。當應用程式啟動時,伺服器在 Global.asa 檔案中尋找並處理
Application_OnStart 事件指令碼。當應用程式終止時,伺服器處理 Application_OnEnd 事件指令碼。
1.Application_OnStart
Application_OnStart 事件在首次建立新的會話(即 Session_OnStart 事件)之前發生。只有 Application 和 Server 內建
對象是可用的。在 Application_OnStart 事件指令碼中引用 Session、Request 或 Response 對象將導致錯誤。
文法
<SCRIPT LANGUAGE=ScriptLanguage RUNAT=Server> Sub Application_OnStart. . . End Sub
</SCRIPT>
參數
ScriptLanguage
指定用於編寫事件指令碼的指令碼語言。它可以是任何支援指令碼編寫的語言,例如 VB Script 或 JScript。如果多個事件使用同一種
指令碼語言,就可以將它們組織在一個 <SCRIPT> 標記下。
2.Application_OnEnd
Application_OnEnd 事件在應用程式退出時於 Session_OnEnd 事件之後發生,只有 Application 和 Server 內建對象可用。
文法
<SCRIPT LANGUAGE=ScriptLanguage RUNAT=Server> Sub Application_OnEnd. . . End Sub
</SCRIPT>
參數
ScriptLanguage
指定用於編寫事件指令碼的指令碼編寫語言。可以是任何一種支援指令碼的語言,例如 VBScript 或 JScript。如果有多個事件使用同
一種指令碼編寫語言,就可以將它們組織在一組 <SCRIPT> 標記下。
注釋
不能在 Application_OnEnd 指令碼中調用 MapPath 方法。
當沒有會話的使用者在開啟應用程式中的 Web 頁時,Web 服務器會自動建立會話。當逾時或伺服器調用 Abandon 方法時,伺服器
將終止該會話。
會話有兩個事件,即 Session_OnStart 事件和 Session_OnEnd 事件。
可以在通用檔案 Global.asa 中為這兩個事件指定指令碼。當會話開始時,伺服器在 Global.asa 檔案中尋找並處理
Session_OnStart 事件指令碼。該指令碼將在處理使用者請求的 Web 頁之前處理。在會話結束時,伺服器將處理 Session_OnEnd 事件
指令碼。
1.Session_OnStart
Session_OnStart 事件在伺服器建立新會話時發生。伺服器在執行請求的頁之前先處理該指令碼。Session_OnStart 事件是設定會
話期變數的最佳時機,因為在訪問任何頁之前都會先設定它們。所有內建對象 (Application、ObjectContext、Request、
Response、Server 和 Session) 都可以在 Session_OnStart 事件指令碼中使用和引用。
文法
<SCRIPT LANGUAGE=ScriptLanguage RUNAT=Server> Sub Session_OnStart. . .End Sub
</SCRIPT>
參數
ScriptLanguage
指定用於編寫事件指令碼的指令碼編寫語言。可以是任何一種支援指令碼的語言,例如 VBScript 或 JScript。如果有多個事件使用同
一種指令碼編寫語言,就可以將它們組織在一組 <SCRIPT> 標記下。
樣本
儘管在 Session_OnStart 事件包含 Redirect 或 End 方法調用的情況下 Session 對象仍會保持,然而伺服器將停止處理
Global.asa 檔案並觸發 Session_OnStart 事件的檔案中的指令碼。
舉一個例子,為了確保使用者在開啟某個特定的 Web 頁時始終啟動一個會話,就可以在 Session_OnStart 事件中調用 Redirect
方法。當使用者進入應用程式時,伺服器將為使用者建立一個會話並處理 Session_OnStart 事件指令碼。您可以將指令碼包含在該事件中
以便檢查使用者開啟的頁是不是啟動頁,如果不是,就指示使用者調用 Response.Redirect 方法啟動網頁。其示範如下例所示。
<SCRIPT RUNAT=Server Language=VBScript>
Sub Session_OnStart
' Make sure that new users start on the correct
' page of the ASP application.
' Replace the value given to startPage below
' with the virtual path to your application's
' start page.
startPage = "/MyApp/StartHere.asp"
currentPage = Request.ServerVariables("SCRIPT_NAME")
' Do a case-insensitive compare, and if they
' don't match, send the user to the start page.
if strcomp(currentPage,startPage,1) then Response.Redirect(startPage) end ifEnd Sub</SCRIPT>
上述樣本只能在支援 cookie 的瀏覽器中運行。因為不支援 cookie 的瀏覽器不能返回 SessionID cookie,所以,每當使用者請
求 Web 頁時,伺服器都會建立一個新會話。這樣,對於每個請求,伺服器都將處理 Session_OnStart 指令碼並將使用者重新導向到啟
動頁中。如果您要使用下面的指令碼,建議您在啟動頁上放一個通知,告訴使用者該網站要求支援 cookie 的瀏覽器。
注釋
請注意,在 Redirect 方法之後的任何 Session_OnStart 事件指令碼都不會執行。因此,應該在您的事件指令碼的最後再調用
Redirect 方法。其示範如下例所示。
<SCRIPT LANGUAGE=VBScript RUNAT=Server>
Sub Session_OnStart
' Session initialization script
Response.Redirect "http:/server/app/StartHere.asp"
End sub
</SCRIPT>
在上面的例子中,Redirect 方法在執行會話初始化指令碼期間隱藏所有顯示給客戶的文字。
2.Session_OnEnd
Session_OnEnd 事件在會話被放棄或逾時發生。在伺服器內建對象中,只有 Application、Server 和 Session 對象可用。
文法
<SCRIPT LANGUAGE=ScriptLanguage RUNAT=Server> Sub Session_OnEnd. . . End Sub
</SCRIPT>
參數
ScriptLanguage
指定用於編寫事件指令碼的指令碼編寫語言。可以是任一支援指令碼編寫的語言,例如 VBScript 或 JScript。如果有多個事件使用同
一種指令碼編寫語言,則可以將其組織在一組 <SCRIPT> 標記下。
注釋
在 Session_OnEnd 指令碼中不能調用 MapPath 方法。
<OBJECT> 聲明
使用者可以在 global.asa 檔案中通過使用擴充的 <OBJECT> 標記建立帶有會話或Application 領域的對象。該標記是自包含的,且
在任何 <SCRIPT> 標記之外。
在 Global.asa 檔案中聲明的對象在伺服器處理調用該對象之前是不會建立的。這樣就只會建立必需的對象,從而節約了資源。
伺服器對帶有Application 領域參數建立的對象不調用 OnStartPage 和 OnEndPage 方法。
文法
<OBJECT RUNAT=Server SCOPE=Scope ID=Identifier {PROGID="progID"|CLASSID="ClassID"}>. . .
</OBJECT>
參數
Scope
指定對象的範圍。在 Global.asa 檔案中,Scope 將被設定為 Session 或 Application。
Identifier
指定對象執行個體的名稱。
ProgID
與類標識相關的標識。無論 ProgID 還是 ClassID 都必須在 <OBJECT> 中指定。ProgID 的格式為 [Vendor.]Component
[.Version]。
ClassID
指定 COM 類別對象的唯一標識。 無論 ProgID 還是 ClassID 都必須在 <OBJECT> 中指定。
樣本
下面的第一個樣本使用 ProgID 參數建立一個對象,其會話範圍名為 MyConnection。第二個樣本使用 ClassID 參數。
<OBJECT RUNAT=Server SCOPE=Session ID=MyConnection PROGID="ADODB.Connection">
REM Object Script
</OBJECT>
<OBJECT RUNAT=Server SCOPE=Session ID=MyConnection CLASSID="Clsid:8AD3067A-B3FC-11CF-A560-00A0C9081C21">
REM Object Script
</OBJECT>
注釋
在 Global.asa 檔案中聲明的對象可被應用程式中的任何指令碼使用。例如,在聲明了下列對象的情況下。
---GLOBAL.ASA---
<OBJECT RUNAT=Server SCOPE=Session ID=MyAd PROGID="MSWC.AdRotator">
</OBJECT>
可以從應用程式中的任何一頁引用 MyAd 對象:
---SOME.ASP---
<%= MyAd.GetAdvertisement("/ads/adrot.txt") %>
TypeLibrary 聲明
ActiveX 組件常常要描述類型庫中該組件支援的常量。類型庫是一個檔案,其中包含有關 ActiveX 組件所支援的對象和類型的信
息。如果使用者的 Web 應用程式依賴於已在類型庫中聲明了類型的 ActiveX 對象,就可以在 Global.asa 檔案中聲明其類型。這
樣做以後,就可以在應用程式範圍內從任何指令碼引用已在類型庫中聲明了的資料類型。
有關在 ASP 中使用常量的詳細資料,請參閱“使用變數和常量”。
文法
<!--METADATA TYPE="TypeLib"
FILE="file"
UUID="typelibraryuuid"
VERSION="majorversionnumber.minorversionnumber"
LCID="localeid"
-->
參數
file
類型庫的絕對路徑。如果提供了該參數和 typelibraryuuid 參數,則 file 將用於標識類型庫。file 參數和
typelibraryuuid 參數都是必選項。
typelibraryuuid
類型庫統一的唯一標識。file 參數和 typelibraryuuid 參數都是必選項。
majorversionnumber
用於選擇版本。如果找不到所需的版本,將返回錯誤。該參數是可選項。
minorversionnumber
用於選擇版本。如果找不到所需的版本,將返回錯誤。該參數是可選項。
localeid
現場標識,用於類型庫。如果找不到所需的現場,將返回錯誤。該參數是可選項。
錯誤資訊
伺服器可返回下列錯誤訊息。
錯誤 說明
ASP 0222 指定的類型庫無效。METADATA 標記包含無效的類型庫指定。
ASP 0223 找不到類型庫。METADATA 包含的類型庫指定與登錄機碼不符。
ASP 0224 類型庫無法載入。ASP 無法載入 METADATA 標記中指定的類型庫。
ASP 0225 類型庫不能重疊。ASP 無法從在 METADATA 標記中指定的類型庫中建立 Type Library Wrapper 對象。
注釋
最好將 METADATA 標記寫在 Global.asa 檔案的開始位置。但是,無論是內部和外部 SCRIPT 標記,都可以出現在 Global.asa
檔案中的任何位置。
通過將類型庫的名稱加在該常量的前面,可以避免對常量的不明確引用。例如,ADODB.adErrItemNotFound 會比
adErrItemNotFound 更明確。
如果使用 Microsoft Visual InterDev 建立 global.asa 檔案,則 METADATA 標記將包含可選的 STARTSPAN 和 ENDSPAN 關
鍵字。而 IIS 則會忽略這兩個關鍵字。
樣本
下面樣本中的 MyComponent 是用 Visual Basic 5.0 編寫的。MyComponent 使用下列語句定義常量 MyError。
Public Const MyError = "You are not using MyComponent correctly."
類型庫包含在 mycomponent.lib 中,該檔案安裝在下面的目錄中。
C:/MyComponent
下面的 METADATA 標記包含在 MyApp 應用程式的 global.asa 檔案中。該樣本使用可選的 STARTSPAN 和 ENDSPAN 標記。而
IIS 則不需要這兩個標記。
<!--METADATA TYPE="TypeLib"
FILE="MyComponent.lib"
-->
現在,MyApp 應用程式中的任何 ASP 都包含如下指令碼:
<%
Dim MyVar
Set MyVar = Server.CreateObject("MyComponent.MyClass")
Currentreturn = MyVar.MyMethod
If Currentreturn = False
Response.Write(MyError)
End If
%>