使用Global.asax 文件
Global.asax 文件(也称作 ASP.NET 应用程序文件)是可选文件,包含用于响应 ASP.NET 或 HttpModule 引发的应用程序级别事件的代码。Global.asax 文件驻留在基于 ASP.NET 的应用程序的根目录中。在运行时,分析 Global.asax 文件并将其编译到一个动态生成的 .NET Framework 类,该类是从 HttpApplication 基类派生的。Global.asax 文件本身被配置为自动拒绝对它的任何直接 URL 请求;外部用户无法下载或查看在该文件中编写的代码。
ASP.NET Global.asax 文件能够与 ASP Global.asax 文件共存。您可以在 WYSIWYG 设计器中或“记事本”中创建 Global.asax 文件,或者将它创建为编译的类并将该类作为程序集部署在应用程序的 \Bin 目录中。但是,在后面的一种情况中,您仍需要一个引用该程序集的 Global.asax 文件。
Global.asax 文件是可选的。如果不定义该文件,ASP.NET 页框架假设您未定义任何应用程序或会话事件处理程序。
当您将更改保存到活动 Global.asax 文件时,ASP.NET 页框架检测到该文件已被更改。它完成应用程序的所有当前请求,将 Application_OnEnd 事件发送到任何侦听器,并重新启动应用程序域。实际上,这会重新启动应用程序,关闭所有浏览器会话并刷新所有状态信息。当来自浏览器的下一个传入请求到达时,ASP.NET 页框架将重新分析并重新编译 Global.asax 文件并引发 Application_OnStart 事件。
有关将 Global.asax 文件用于应用程序的详细信息,请参见下面的主题:
在应用程序的生存期中,ASP.NET 维护一系列 Global.asax 导出的 HttpApplication 实例。当应用程序接收到 HTTP 请求时,ASP.NET 页框架将分配这些实例中的一个来处理该请求。该特定的 HttpApplication 实例负责管理它所分配到的请求的整个生存期,并且只有在完成该请求后才可以再次使用该实例。
通过 HttpApplication 类,可以以编程方式访问 HttpApplication.Init 和 HttpApplication.Dispose 方法,以及 Application_OnStart 和 Application_OnEnd 事件。也可以访问由 HttpModule 公开的任何事件。
重写 Init 和 Dispose 方法
在创建 HttpApplication 类的实例后立即调用 HttpApplication.Init 方法。可以使用该方法创建并配置要跨所有处理事件使用的任何对象,如下面的示例所示。
[Visual Basic] <script language="VB" runat="server"> Public Overrides Sub Init() 'Insert something interesting here. End Sub </script> [C#] <script language="C#" runat="server"> public override void Init() { // Insert something interesting here. } </script>
Init 方法与 Application_OnStart 事件不同,因为总是对应用程序中的所有 HttpApplication 实例调用该方法。在应用程序的生存期中只调用一次 Application_OnStart,这便是对 HttpApplication 的第一个实例调用。使用 Application_OnStart 只是为了创建或修改所有管线实例共享的状态,例如 ApplicationState 对象的使用。因为局部变量不被多个 HttpApplication 实例共享,所以不要使用它来创建局部变量。紧接着销毁 HttpApplication 类的实例之前调用 HttpApplication.Dispose 方法。您可以使用它来清理任何本地资源。
Dispose 方法与 Application_OnEnd 事件不同,因为总是对应用程序中所有 HttpApplication 实例调用该方法。在应用程序的生存期中只引发一次 Application_OnEnd,这便是对被强行停止 HttpApplication 的最后一个实例引发。使用 Application_OnEnd 只是为了清理所有管线实例共享的状态或资源,例如 ApplicationState 对象的使用。因为局部变量不被多个 HttpApplication 实例共享,所以不要使用它来清理局部变量。
在请求执行的 Init 或 Dispose 阶段,您不能使用 HttpApplication 实例的 Request、Response 和 Session 属性。
下面的示例演示如何重写 HttpApplication 基类提供的两个生命周期方法。
[Visual Basic] <script language="VB" runat=server> Public Overrides Sub Init() ' Init override code goes here. End Sub Public Overrides Sub Dispose() ' Init override code goes here. End Sub </script> [C#] <script language="C#" runat=server> public override void Init() { // Init override code goes here. } public override void Dispose() { // Init override code goes here. } </script>
处理 HttpApplication 事件
您可以使用 Global.asax 文件来同步 HttpApplication 基类公开的任何事件。若要完成该操作,您必须使用下面的命名模式来创作方法:
Application_EventName(AppropriateEventArgumentSignature)
例如,如果想要响应应用程序的 OnStart、BeginRequest 和 OnEnd 事件的代码,您包括在 Global.asax 文件中的代码看起来可能像下面这样。
[Visual Basic] <Script language="VB" runat="server"> Sub Application_OnStart() 'Application start-up code goes here. End Sub Sub Application_BeginRequest() 'Application code for each request could go here. End Sub Sub Application_OnEnd() 'Application clean-up code goes here. End Sub </script> [C#] <Script language="C#" runat="server"> public void Application_OnStart() { // Application start-up code goes here. } public void Application_BeginRequest() { // Application code for each request could go here. } public void Application_OnEnd() { // Application clean-up code goes here. } </script>
ASP.NET 在 Global.asax 中提供多个模块,这些模块参与每个请求并公开您可以处理的事件。您可以随意自定义或扩展这些模块,或开发全新的自定义模块来处理对基于 ASP.NET 的应用程序进行的 HTTP 请求的信息及其相关信息。例如,您可以创建一个输出缓存模块,该模块实现整个应用程序的输出缓存行为。
所有模块(不管是自定义的还是 .NET Framework 提供的)必须实现 IHttpModule 接口。只要这些模块注册到应用程序,您便可以方便地与进入应用程序的 HTTP 请求进行交互。
处理 HttpModule 事件
可以使用 Global.asax 文件来处理请求中模块公开的任何事件。例如,您可以为 ASP.NET Web 应用程序创建一个自定义身份验证模块,在该模块中可以公开一个 OnAuthenticateRequest 事件。您编写的处理 HTTPModule 模块所公开的事件的代码必须符合以下命名模式:
FriendlyModuleName_EventName(AppropriateEventArgumentSignature)
例如,如果要包括会话的开始和结束以及 OnAuthenticateRequest 事件的事件处理代码,则它看起来可能像下面这样。
[Visual Basic] <Script language="VB" runat="server"> Sub Session_OnStart() 'Session start-up code goes here. End Sub Sub Session_OnEnd() 'Session clean-up code goes here. End Sub Sub Application_OnAuthenticateRequest(Source As Object, Details as EventArgs) 'Authentication code goes here. End Sub </script> [C#] <Script language="C#" runat="server"> void Session_OnStart() { // Session start-up code goes here. } void Session_OnEnd() { // Session clean-up code goes here. } void Application_OnAuthenticateRequest(Object Source, EventArgs Details) { // Authentication code goes here. } </script>