Application的生存期
一個ASP.NET application建立於伺服器第一次被請求時,在那之前不會有ASP.NET代碼在執行。接受第一次請求後,一個HttpApplication執行個體池被建立,並啟用了Application_OnStart事件。HttpApplication執行個體處理這個請求及隨後發生的請求,直到最後的執行個體退出,接著就觸發Application_OnEnd事件。
注意,在每一個執行個體中HttpApplication的Init以及Dispose方法都被調用,因此在Application_OnStart 和 Application_OnEnd事件間將被調用多次。在一個ASP.NET application中,只有這些事件在所有HttpApplication執行個體中被共用。
關於多線程
如果我們以application範圍類型使用對象,我們就應該注意ASP.NET是並發處理請求的,從而Application對象可以被多個線程所訪問。因此,如果下面例子中的代碼在同一時間被不同的客戶機訪問,它就是危險的,可能不會達到預期目的。為對照方便,我們列出了使用VB、C#以及JScript三種語言編寫的代碼:
C#
<%
Application["counter"] = (Int32)Application["counter"] + 1;
%>
VB
<%
Application("counter") = CType(Application("counter") + 1, Int32)
%>
為了實現安全的線程處理,我們可以通過Lock和Unlock方法處理這個Application對象。請看下面使用VB、C#以及JScript三種語言編寫的代碼:
C#
<%
Application.Lock();
Application["counter"] = (Int32)Application["counter"] + 1;
Application.UnLock();
%>
VB
<%
Application.Lock()
Application("counter") = CType(Application("counter") + 1, Int32)
Application.UnLock()
%>
檔案Global.asax
除了編寫UI(Use Interface:使用者介面)以外,我們還可以在Web Application中添加"application"層級的控制邏輯代碼以及事件觸發程式。這些代碼不會去操作產生UI,並且基本上不會響應於單獨的頁面請求,它們負責的是處理進階別的application事件,包括Application_Start、Application_End、Session_Start和Session_End。這些控制邏輯代碼位於Web
application所在虛擬目錄結構根目錄下的Global.asax檔案中,ASP.NET自動地解析這個檔案並編譯為動態.NET架構類。這個類擴充了HttpApplication基類,當位於application名字空間內的任意資源或URL被首次訪問時,它就被建立。
Global.asax檔案本身經過了設定,任何關於它的直接URL請求都會被自動拒絕,從而保證了外部使用者無法下載它並瀏覽其內容。
Application 或 Session作用範圍內的事件
我們可以在Global.asa檔案中編寫方法以定義有關HttpApplication基類的事件觸發程式,方法的命名要匹配於字串"Application_事件名稱"。比如,請看下面使用VB、C#以及JScript三種語言編寫的代碼:
C#
<script language="C#" runat="server">
void Application_Start() {
// Application startup code goes here
}
</script>
VB
<script language="VB" runat="server">
Sub Application_Start()
’ Application startup code goes here
End Sub
</script>
如果事件觸發代碼需用輸入另外的名字空間,我們可以在.aspx頁面中編寫類似如下代碼的輸入標識:
<%@ Import Namespace="System.Text" %>
下面的例子圖解了Application、Session 和Request 的生存期:
頁面首次開啟時,將啟用application和session的Onstart事件。關於這些事件觸發程式,請看下面使用VB、C#以及JScript三種語言編寫的代碼:
C#
void Application_Start() {
Response.Write("Application is Starting...");
}
void Session_Start() {
Response.Write("Session is Starting...");
Session.Timeout = 1;
}
VB
Sub Application_Start()
Response.Write("Application is Starting...")
End Sub
Sub Session_Start()
Response.Write("Session is Starting...")
Session.Timeout = 1
End Sub
每次請求發生時,都會啟用BeginRequest 和EndRequest 事件。比如,當頁面被重新整理時,來自BeginRequest、EndRequest
和Page_Load 方法的資訊將顯現出來。注意,當放棄當前的session時(點擊"End this session"按鈕),將產生一個新session,接著再次觸發Session_OnStart事件。