Global.asax 文件
除了編寫 UI 代碼外,開發人員還可以將應用程序級別的邏輯和事件處理代碼添加到他們的 Web 應用程序中。此代碼不處理 UI 的生成,並且一般不為響應個別頁請求而被調用。相反,它負責處理更高級別的應用程序事件,如 Application_Start、Application_End、Session_Start、Session_End 等等。開發人員使用位於特定 Web 應用程序虛擬目錄樹根處的 Global.asax 文件來創作此邏輯。第一次激活或請求應用程序命名空間內的任何資源或 URL 時,ASP.NET 自動分析該文件並將其編譯成動態 .NET 框架類(此類擴展了 HttpApplication 基類)。
第一次激活或請求應用程序命名空間內的任何資源或 URL 時,ASP.NET 分析 Global.asax 文件並將其動態編譯成 .NET 框架類。Global.asax 文件被配置為自動拒絕任何直接 URL 請求,從而使外部用戶不能下載或查看內部代碼。
應用程序或會話范圍內的事件
通過在 Global.asax 文件中創作符合命名模式“Application_EventName(AppropriateEventArgumentSignature)”的方法,開發人員可以為 HttpApplication 基類的事件定義處理程序。例如:
C#:
<script language="C#" runat="server">
void Application_Start(object sender, EventArgs e) {
// Application startup code goes here
}
</script>
VB:
<script language="VB" runat="server">
Sub Application_Start(Sender As Object, E As EventArgs)
' Application startup code goes here
End Sub
</script>
如果事件處理代碼需要導入附加的命名空間,可以在 .aspx 頁中使用 @ import 指令,如下所示:
<%@ Import Namespace="System.Text" %>
第一次打開頁時,引發應用程序和會話的 Start 事件:
C#:
void Application_Start(object sender, EventArgs e) {
// Application startup code goes here
}
void Session_Start(object sender, EventArgs e) {
Response.Write("Session is Starting...<br>");
Session.Timeout = 1;
}
VB
Sub Application_Start(Sender As Object, E As EventArgs)
' Application startup code goes here
End Sub
Sub Session_Start(Sender As Object, E As EventArgs)
Response.Write("Session is Starting...<br>")
Session.Timeout = 1
End Sub
對每個請求都引發 BeginRequest 和 EndRequest 事件。刷新頁時,只顯示來自 BeginRequest、EndRequest 和 Page_Load 方法的消息。注意:通過放棄當前會話(單擊“結束此會話”按鈕),將創建新的會話並且再次引發 Session_Start 事件。
應用程序或會話范圍內的對象
靜態對象、.NET 框架類和 COM 組件都可以使用對象標記在 Global.asax 文件中定義。范圍可以是 appinstance、session 或 application。appinstance 范圍表示對象特定於 HttpApplication 的一個實例並且不共享。
<object id="id" runat="server" class=".NET Framework class Name" scope="appinstance"/>
<object id="id" runat="server" progid="COM ProgID" scope="session"/>
<object id="id" runat="server" classid="COM ClassID" scope="application"/>