11.2  Global.asax文件的使用

Global.asax文件是Web应用程序的系统文件,属于选项文件,可有可无。当需要使用Application和Session对象的事件处理程序时,就需要创建此文件。

11.2.1  Global.asax 文件的结构

ASP.NET的Global.asax文件是ANSI文本文件,使用Windows记事本或VWD都可以编辑Global.asax文件的内容。

1. 创建Global.asax文件

Visual Web Developer可以创建Global.asax文件。启动VWD打开Ch11网站后,执行“文件”|“新建文件”命令,打开“添加新项”对话框。

图11-2  “添加新项”对话框

选择“全局应用程式类”选项(如果网站已经建立就不会看到此项目),单击“打开”按钮就可以在Web网站中创建Global.asax文件。一个Web网站只能拥有一个Global.asax文件。

2. Global.asax文件结构

Global.asax文件主要是定义Web应用程序的Application_Start()、Application_End()、Session_Start()和 Session_End()等事件处理程序,文件结构如下所示。

<%@ Application Language="VB" %>
<script Runat="server">
Sub Application_Start(ByVal Sender As Object,_
                    ByVal E As EventArgs)
End Sub
Sub Application_End(ByVal Sender As Object,_
                   ByVal E As EventArgs)
End Sub
Sub Application_Error(ByVal Sender As Object,_
                    ByVal E As EventArgs)
End Sub
Sub Session_Start(ByVal sender As Object,_
                    ByVal e As EventArgs)
End Sub
Sub Session_End(ByVal sender As Object,_
                    ByVal e As EventArgs)
End Sub
</script>

上述第1行程序代码是使用Application命令的Language属性声明使用Visual Basic 2005语法,在<script>标记中是Application和Session对象的事件处理程序,其说明如表11-3所示。

表11-3  Application和Session对象的事件处理程序

事件处理程序

说    明

Application_Start()

当第 1 位用户进入 ASP.NET 程序时,Application_Start 事件就触发,在触发后,就算有成千上万位用户进入网站都不会重新触发,除非 Web 服务器关机。通常用来初始化 Application 变量,例如初始的访客计数

Application_End()

当 Web 服务器关机时,Application_End 事件就会触发

Application_Error()

当产生未能处理错误时,触发 Application_Error 事件

Session_Start()

当用户建立 Session 时间时,就触发 Session_Star 事件,如果有 50 位用户,就触发 50 次事件,每个事件是独立触发的,不会互相影响,通常用来初始化用户专用的 Session 变量

Session_End()

当用户在默认时间内没有进入其他ASP.NET 程序时,就会触发此事件,时间是由 TimeOut 属性设定,通常是善后用途的程序代码,例如将 Session 变量存入数据库或文本文件

当web.config文件(详见11-7节说明)的sessionstate模式设为InProc(此为默认值)才会触发Session_End事件,如果设为StateServer或SQLServer就不会触发此事件。

11.2.2  Global.asax文件的使用

在ASP.NET的Web应用程序中使用Global.asax文件时,注意,一个Web应用程序只能有唯一的Global.asax文件,其位置是Web应用程序的启动点目录。

1. Global.asax事件处理程序的执行顺序

当用户请求ASP.NET程序后,就会替每位用户建立Session时间和Application对象,接着检查ASP.NET应用程序是否含有Global.asax 文件。

如果有Global.asax文件,就将它编译成继承HttpApplication类的 .NET Framework 类,然后在执行 ASP.NET 文件的程序代码前触发 Application_Start 事件,执行 Global.asax 文件的 Application_Start()事件处理程序,并建立 Session对象,因为 Global.asax 文件存在,接着执行 Session_Start()事件处理程序。

当 Session 时间超过 TimeOut 属性的设定(默认20分钟)或执行 Abandon()方法,表示 Session 时间结束,就触发 Session_End事件执行 Session_End()事件处理程序,处理程序是在关闭 Session 对象前执行。

Web 服务器如果关机,在关闭 Application 对象前就会执行 Application_End()事件处理程序,当然也会结束所有用户的 Session 时间,执行所有用户的 Session_End()事件处理程序。

2. ASP.NET程序:Global.asax

在 Global.asax 文件的事件处理程序中建立程序代码(有需要才创建事件处理程序),以便显示事件处理程序的执行过程,如下所示。


3. 程序说明

第3~6行是Application_Start()事件处理程序,第5行使用Application变量 msg 存储执行信息(Application 变量的说明请参阅第 11.3 节),因为执行此程序时尚未加载网页,所以只能使用 Application 变量来存储执行信息。文件没有 Application_End()事件处理程序,因为当执行此程序时,表示 Application 已经结束,并没有办法显示任何信息。

第 7~13 行是 Session_Start()事件处理程序,第 9~11 行显示 Application 变量值后,清除变量内容,第 12 行显示 Session 时间开始的信息。

第 14~17 行是 Session_End()事件处理程序,因为 Session 时间已经结束,所以第 16 行使用 Application 变量存储信息内容。最后第 18~25 行是 Application_BeginRequest()和 Application_EndRequest()两个事件处理程序,它们是在浏览程序中提出请求和结束请求时触发,在这两个事件间会触发 Page 对象的 Load 事件。

4. ASP.NET程序:Ch11-2-2.aspx

在 ASP.NET 程序中显示整个 Global.asax文件的事件处理程序的执行过程,包含网页请求事件的执行顺序,在 Web 窗体中含有两个按钮,可以更新网页和结束 Session 时间,如下所示。

01: <%@ Page Language="VB" %>
02: <script  runat="Server">
03: Sub Page_Load(Sender As Object,E As EventArgs)
04:    Response.Write("载入网页...<br>")
05: End Sub
06: Sub SessionOver(Sender As Object,E As EventArgs)
07:    Session.Abandon() ' 结束Session时间
08:    ' 转址至自已
09:    Response.Redirect("Ch11-2-2.aspx")
10: End Sub
11: </script>
12: <html>
13: <head><title>Ch11-2-2.aspx</title></head>
14: <body>
15: 显示网页内容...(
16: <% If Session.IsNewSession = True Then
17:       Response.Write("新的Session时间")
18:    Else
19:       Response.Write("同一个Session时间")
20:    End If %>)
21: <form Runat="server">
22: <asp:Button Id="button0" Text="更新网页" Runat="server"/>
23: <asp:Button Id="button1" OnClick="SessionOver"
24:           Text="结束Session" Runat="server"/>
25: </form>
26: </body>
27: </html>

5. 程序说明

第3~5行是Page_Load()事件处理程序,第4行显示执行程序的信息。第6~10行是Button控件的Click事件处理程序,第7行使用Abandon()方法结束 Session时间,第11行转址重新加载自己。

第16~20行的If 条件使用IsNewSession属性检查是否为新建立的Session时间,第21~25行是两个按钮的Web窗体。

6. 网页预览

将Ch11\Ch11-2-2文件夹建立为虚拟目录后,启动浏览程序执行 Ch11-2-2.aspx 程序,可以看到执行过程的信息,如图11-3所示。

图11-3所述信息显示事件处理程序的执行顺序,首先执行 Application_Start事件,然后是 Application_BeginRequest 和 Session_Start 事件,因为 Application_Start 事件的信息是在 Session_Start 事件处理程序中显示的,所以顺序相反,Application_Start事件是在 Application_BeginRequest 事件前触发。

在新的 Session 时间开始后,触发 Page_Load 事件加载网页来显示网页内容,请求过程结束触发 Application_EndRequest 事件。

单击“结束 Session”按钮以Abandon()方法强迫结束Session时间,因为重新加载网页,可以看到Session结束后再次建立新的Session时间,如图11-4所示。


接着单击“更新网页”按钮,因为尚未结束 Session 时间,可以看到只加载网页和请求信息,表示属于同一个 Session 时间,如图11-5所示。