使用Global.asax 文件

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 文件用于应用程序的详细信息,请参见下面的主题:

使用 HttpApplication 实例

将模块用于 Global.asax 文件

使用 HttpApplication 实例

在应用程序的生存期中,ASP.NET 维护一系列 Global.asax 导出的 HttpApplication 实例。当应用程序接收到 HTTP 请求时,ASP.NET 页框架将分配这些实例中的一个来处理该请求。该特定的 HttpApplication 实例负责管理它所分配到的请求的整个生存期,并且只有在完成该请求后才可以再次使用该实例。

通过 HttpApplication 类,可以以编程方式访问 HttpApplication.InitHttpApplication.Dispose 方法,以及 Application_OnStartApplication_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 实例共享,所以不要使用它来清理局部变量。

在请求执行的 InitDispose 阶段,您不能使用 HttpApplication 实例的 RequestResponseSession 属性。

下面的示例演示如何重写 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)

例如,如果想要响应应用程序的 OnStartBeginRequestOnEnd 事件的代码,您包括在 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>

将模块用于 Global.asax 文件

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>
posted @ 2006-11-22 10:32  疯一样的自由  阅读(10702)  评论(1编辑  收藏  举报