asp.net跟踪的内部机制是完美的,它提供了很好的跟踪页面运行时信息的办法,并允许你声明和校验动态的内部的值。另一方面,它不会显示所有你想跟踪的信息及令人讨厌的基于文本的界面。跟踪信息是依据页面生命周期中最后的一个事件触发后生成的。众所周知,asp.net页面是从HttpRuntime环境下得到一个请求事件后开始工作的。从Page_Init到Page_Unload事件,也包括Page_Load和Page_PreRender事件记录了页面的整个生存周期。当页面的最后一个事件触发时,浏览器的html还没有被预呈现。在页面呈现时,html代码临时缓存在输出流中,等待注册的处理模块作进一步的处理。这时,页面中的代码不能访问附加输出的跟踪html信息。这种封闭的结构,连同我们不喜欢的基于文本的用户界面一起封装起来,也给了我们另一个可选的方案。
在讨论mytracer之前,我先说明一点,是关于asp.net 的页面跟踪。你应注意把页面的trace属性设为false,那么页面代码中的调试语句(trace.write或trace.warn)就无效了(不会在页面中输出调试信息)。实际上不管是否允许跟踪,write和warn方法都会执行。这也许在执行程序的时候有影响,但是它可以忽略不计,尤其是在没有用代码进行跟踪时,就更不会有什么影响了。要允许或不允许跟踪最简单的办法是在web.config文件中设置trace配置段,也可通过跟踪查看器设置。当接到用户的反馈时(例如不能停止应用程序)要跟踪应用程序,用上述的方法重新激活跟踪,按条件输出跟踪信息。
在asp.net 1.x可以选择另一种方法来写跟踪工具,你可以把它当成一个http模块来写,及用HttpApplication事件和ASP.NET对象模式去收集程序运行时要显示的信息。另外,你还可以使它暴露方法和事件以便与页面相结合。在本期栏目中,我将用一个不同的方法开发一个的windows应用程序与vs.net集成使用。最后,mytracer是一个windows应用程序,它嵌入了WebBrowser ActiveX®组件用于显示web页面,并且运用了web service作为asp.net和windows的桥梁。图4显示了该工具运行一个示例页的情况:
该工具可以运行及显示指定的页。如果page页已配置了MyTracer(下面会讲怎么在页中配置mytracer,使页面可以被mytracer跟踪),那么页面指定的信息将输出,这些信息是用位于同一虚拟目录web Serveice作为跟踪应用程序生成的。 Windows form应用程序处理DocumentComplete事件,并与web service连接下载已准备好的asp.net运行时的信息,然后它简单的组织生成各种信息表,表中输出各种信息,如:session, Application, Cache, view state, input form, server变量,及页面的控件树等。
Mytracer由三个部分组成----windows forms 应用程序(如图4所示),前述的web service,以及被跟踪页面必须包含的web 用户控件。用户控件(mydebugtool.ascx)与页面的生存周期中的主要事件关联并把跟踪信息存入dataset对象中。当页面卸载时,dataset被存入数据库中,这类似于asp.net中的用SQL Server™管理session状态。Web service从数据库中重新获得该对象(dataset对象),Windows Forms程序再从web service中下载该对象。数据总是以dataset的形式一级级的传递,直到它显示给用户看。数据库和web service都有比较简单的结构。