就像在经典ASP中的应用程序一样,ASP.NET的应用程序也是由根目录中的文件以及下一级的子目录中的文件组成的。具有代表性的,尽管根目录可能直接处于IIS主目录下,此根目录仍然会出现在IIS的虚拟目录下。除了.aspx页面之外,根目录还可能包含两个可选择的文件:Web.config以及Global.asax文件。ASP.NET中存储了如同在Web.config里边的XML程序设计语言应用程序设置。其中,典型的设置包括被用于鉴定应用程序的方法以及the session timeout value。
见列表D中的Global.asax,其中包括了处理应用程序层次事件的程序代码,就像在经典ASP中的Global.asa文件。在Global.asax中的<script>标签包含了面对应用程序层次的事件处理器。第一组的事件处理器负责处理应用程序的开始以及停止事件。一个开始事件会在任何页面第一次被请求的时候被唤醒。而应用程序终止事件则会在应用程序关闭的时候被唤醒。
另外的一组事件处理器负责处理会话(session)开始以及终止事件。当一个单独的浏览器访问一个应用程序页面的时候,一个会话(session)就在应用程序内部被创建出来。这个会话会一直存在,直到被应用程序任意的终止联接或者关闭的时候为止。Session开始以及终止事件是对Session过程的一种描述。
ASP.NET运行时处理Global.asax的方式与ASP.NET处理一个.aspx文件的方式相类似。一种被叫做Global_asax的.NET类型是从Global_asax中产生出来的。而Global_asax则来自System.Web.HttpApplication应用程序,并且被放置于ASP的存储名字的空间(namespace)中。这个库中包含的Global_asax为了ASP.NET文件而被放置于一个临时目录中,举个例子:
C:WINNTMicrosoft.NETFrameworkv1.0.3328Temporary ASP.NET_ Filesaspnetevents118b3fbe9c41abcd
HttpApplication使一些应用程序层次的事件暴露了出来。这些事件在程序运行周期中为大家提供额外的信息提示,比如当每一次的请求开始以及结束的时候,或者当确认鉴定操作正在执行的时候,就会提示使用者正在进行此类的操作。这些针对以上那些事件的事件处理器拥有 Application_Event的名字。除了合适的名称之外,没有什么是需要附加粘贴在这些事件处理器上边的。在Global.asax顶端指明的@ Application并不支持任何的一项AutoEventWireup属性。
应用程序层次的事件处理器能够被放置到一个被分离出来的C#程序文件中,和页面层次的事件处理器一样,并且能够通过添加Inherits属性到@ Application指示上来被加入到生成的Global_asax类目中去。由于在Global.asax中没有其它的任何东西,所以,我会选择把这些事件处理器都放在那里边。然而,由于ASP.NET在运行时并不处理Global.asax,并且直到第一次请求应用页面发生才会进行处理,所以在脚本<script>代码中的语法错误并不会在很短得时间内被发现出来。
就像在GreeterLogic中的页面层次事件处理器一样,在Global.asax中调用每一个应用程序层次的事件处理器的操作都会被记录在使用Log.LogCall的日志文件中。而位于Global.asax 顶端的@ Imports指示会引入TechRepublic名字空间(namespace),其中包含了日志文件,就像是在使用TechRepublic来记录一样;所有的指示都会存在于C#语言中。
在二进制扩展名文件子目录下的Log以及Greeter文件中,我们已经准备好了通过打开一个浏览器以及请求Greeter.aspx (见图一)来运行这个应用程序。在输入了你的用户名之后,点击后面的写有Get Greeting字样的按钮,打开并且保存Global.asax文件。这将会升级文件修正时间以及减少ASP.NET运行所需要的时间,来结束应用程序的运行以及关闭这部分的窗口。关于日志文件,如图表E中所示,现在已经包含了全部的事件序列。要注意的是并不是所有的应用程序以及页面事件处理器正在被调用。举个例子来说,如果所有的事情进行的顺利的话,应用程序错误Application_Error以及页面错误Page_Error事件处理器两者都不会调用执行。在日志文件上面显示的是两个页面请求:一个是请求初始化访问,而另一个是请求返回(post-back)。您应该能够在处于Page_Load入口处的下面看到此页面的post-back状态。而第二个页面请求包括了一个对GreeterLogic.Button_Click的调用请求。
图一:
Greeter screen的初始化状态。
如果您对于ASP.NET内部感到非常的好奇的话,你还可以试着变更Global.asax以及 Greeter.cs中的一个常量m_showTrace为真值true,然后进行重新编译,并且重新运行这个应用程序。在列表 F中所展示的日志文件中能够显示每一次的事件处理器调用的堆栈情况。你将会看到有许多的ASP.NET run-time类别以及方法是不公开的或者是在某范围内部才能公开的,而且你不会在MSDN微软公司软件开发商网络MSDN上的文件中找到它们。尽管如此,我还是发觉能够窥探ASP.NET run time内部的情况是一件非常有意思的事情。
责任编辑:超凡