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"/>