MyTracer 监视和跟踪 ASP.NET 应用程序
发布时间:2022-09-24 14:50:37 所属栏目:Asp教程 来源:
导读: MyTracer监视和跟踪ASP.NET应用程序Microsoft.NETFramework随附了一组丰富的用于调试和跟踪应用程序的编程工具。我谈论的不是集成调试器;而是在开发周期中使用的软件组件。调试器是一种不同的工具,因为它们是通
|
MyTracer监视和跟踪ASP.NET应用程序Microsoft.NETFramework随附了一组丰富的用于调试和跟踪应用程序的编程工具。我谈论的不是集成调试器;而是在开发周期中使用的软件组件。调试器是一种不同的工具,因为它们是通常与成熟的IDE(例如,VisualStudio.NET)集成的交互式工具。Systems.Diagnostics命名空间定义了两个类,分别名为TraceDebug,它们的方法可以用来输出包含有关代码执行信息的消息。该功能对于跟踪数据不一致、监视执行流和断言条件甚至收集分析数据都非常有用。TraceDebug类几乎完全相同,并且在名为“侦听器”的更为专用的模块之上工作。用于跟踪WindowsASP.NET应用程序的工具具有颇为不同的特征。特别地,Windows体应用程序所支持的跟踪机制具有基于自定义侦听器的可扩展性模型;而ASP.NET应用程序的跟踪机制则不是这样。相反,ASP.NET子系统提供了一种自定义跟踪模型。当页在跟踪模式下执行时,会有多种表被追加到输出中,并且这些表显示有关性能、请求和状态的信息。不管您是否将消息写入该页的跟踪日志中,这些表总是被追加到发往浏览器的输出的底部。 VisualStudio.NET提供了一个强大的集成式调试器,该调试器支持各种前卫功能,例如,断点、快速监视和各种单步调试代码的方式。调试器是捕捉错误以及单步执行小而关键的代码部分的理想工具。因此,如果您使用VisualStudio.NET生成项目,则不能要求更多的功能了。但是,如果您不使用VisualStudio.NET,该怎么办呢?如果您使用不提供调试支持的编辑器,该怎么办呢?在这样的情况下,用于跟踪应用程序行为的编程工具的重要性显著增加。在本专栏中,我将首先分析所有ASP.NET应用程序都可以使用的跟踪子系统,然后编写一个Windows窗体应用程序,该程序执行给定的页并收集诸如页的视图状态、请求上下文以及全局对象(如Cache、ApplicationSession)的内容等运行库信息。该应用程序(我将其称为MyTracer)可以与VisualStudio.NET集成并构成默认浏览器的替代品(至少在测试阶段)。我应当指出的是,在某些位置我将使用未记录的类。这不太可能影响代码,但这些类将来可能会更改。支持跟踪的ASP.NET尽管可以向web.config文件中添加跟踪配置节以便在应用程序级别配置跟踪,但跟踪是一种通常针对单个页进行控制的功能。 对于大型项目,可以在应用程序的web.config文件中使用以下代码来启用和禁用跟踪属性:Enabled属性授权对应用程序进行跟踪,而pageOutput属性则允许输出在页中出现。如果将pageOutput设置为false(默认设置),则跟踪输出被自动发送到ASP.NET跟踪程序工具trace.axd。在项目收尾阶段,只须将跟踪元素的这两个属性都设置为false。这样,就可以消除无意中将跟踪保留为启用状态的风险。要只对特定页启用跟踪,请在@Page指令中使用trace属性。该属性的默认值为false。当您将其设置为true时,系统和自定义跟踪信息都将出现在页的底部,如图系统和自定义跟踪您应当注意,跟踪信息是实际页输出的一部分,并且因此通过访问该页的任何类型的浏览器显示。正如您可以从该图中猜测到的那样,一些信息表与该页生成的跟踪信息一起显示。附加表显示请求详细信息、控件树和某些有用的集合,例如,Cookie、标头、表单值和服务器变量。如果会话和应用程序状态不为空,则SessionApplication内部对象的内容也包含在视图中。视图状态和Cache对象的内容不会刷新到跟踪日志中。以上就是我的工具将提供的关键增强功能。 @Page指令还提供了TraceMode属性,以便让您能够选择信息的显示顺序。可行的值为字符SortByTime。默认情况下,跟踪消息按照它们的发出顺序出现。如果将TraceMode属性设置为SortByCategory值,则出现在TraceInformation节中的行按照类别名称排序。每个行所属的类别都由用来发出消息的方法确定。发出跟踪消息ASP.NET页使用TraceContext类公开的方法来填充它的跟踪日志。当设置了HTTP请求以便执行时,将创建该类的实例。然后,通过HttpContextTrace属性公开跟踪程序对象,并Trace属性对其进行镜像。TraceContext类具有非常简单的接口,该接口具有几个属性和一样多的方法。这些属性为IsEnabledTraceMode。IsEnabled是一个指示是否启用了跟踪的只读布尔型属性。该属性返回的值受到@Page指令中的trace属性以及web.config文件的trace节中的已启用属性的影响。TraceMode属性获得并设置在该页中显示所跟踪行的顺序。该属性的类型是TraceModeSortByTime)的枚举。要发出消息,可以使用WriteWarn方法。 这两个方法都具有三个行为方式相同的重载。WriteWarn是几乎完全相同的方法。唯一可见的差异是Warn总是以红色输出消息。Write方法具有三个重载:PublicSubWrite(msgString)PublicSubWrite(catString,msgString)PublicSubWrite(catString,msgException);最简单的重载只是在消息列中发出指定的文本。在第二个重载中,第一个字符串参数表示您要用于该消息(它是第二个参数)的类别的名称。类别名称可以用来对跟踪信息进行排序,并且是任何对该应用程序有意义且能够更好地解释该消息的名称。最后,第三个重载添加一个额外的Exception对象,以防该消息跟踪错误。在这种情况下,消息列中的文本是通过将您指定为参数的文本和有关异常的消息连接在一起而创建的。尽管WriteWarn的文本输出都被呈现为HTML页,但未应用特殊的样式或格式。字符串作为纯文本写入,因此如果您试图使用任何特殊格式(例如,粗体标记),则您将获得的是附加了可见的子字符串的跟踪消息。无须使用完全限定名称,就可以从.aspx页的源代码中或者从代码隐藏类中访问ASP.NETTrace对象。 嵌入到页中的自定义控件和它们的代码隐藏类还可以直接访问跟踪子系统。但是,其他类不能这样做。假设您的代码隐藏类委托外部类来完成某些任务。该辅助类如何在ASP.NET页中执行跟踪?在该辅助类的上下文中,页Trace对象不可用(起码在其非限定的直接形式下不可用)。如果外部类希望在当前 HTTP 请求的跟踪日志中发出文本,则必须使用以下表达式 调用跟踪程序: System.Web.HttpContext.Current.Trace.Write(cat, msg) 请注意,ASP.NET 跟踪系统不支持它自己的侦听器集,也不支持那些通过诊断跟踪节注册的侦 听器。此外,不存在修改跟踪的输出以便只显示几个标准数据表的已知方式。如果要增强或修改 它,则需要全新的方法。 跟踪查看器 ASP.NET 还通过跟踪查看器工具支持应用程序级别跟踪。在为应用程序启用跟踪之后,每个页 请求都会将所有特定于该页的跟踪信息发送到查看器。可以通过从应用程序根目录中请求 trace.axd 来观察跟踪查看器(参见图 2)。就像我先前提到的那样,通过在应用程序的 web.config 文件(即,在根文件夹中部署的配置文件)中放置一个 trace 节,可以启用查看器: 由于 pageOutput 属性默认情况下为 false,因此只有查看器接收跟踪信息。 但是,每个页都可 以通过在 @Page 指令中使用 trace 属性来单独重写该设置。跟踪查看器所缓存的请求数不会 超过 requestLimit 属性所指定的请求数(默认情况下为 10)。 查看跟踪查看器简而言之,ASP.NET 跟踪查看器充当集中式控制台,并且收集特定应用程序中的页所生成的全 部跟踪信息。每个请求(直到由 requestLimit 确定的最大编号)都由查看器界面中的行进行标 识,并且可以在查看器的缓存被清除之前参考(参见图 可以通过在应用程序的根目录中请求trace.axd URL 来激活查看器。AXD 是一种通过 aspnet_isapi.dll ISAPI 扩展名解析的特殊的资源类型,如图 之后,查看器自动跟踪所有请求,并且为每个请求缓存全部跟踪。在到达请求限制时,除非手动清除日志,否则不会再缓存其他请求。可以单击每个“View Details”链接以查看该特定请求的跟 请求跟踪用于跟踪的内置机制对于 ASP.NET 来说很完美,因为它提供了许多运行库信息,并且使您可以 断言和验证内部结构的动态值。另一方面,它并未显示您可能要跟踪的所有信息,并且基于文本 的用户界面非常乏味。 在该页的最后一个生命周期事件激发之后,跟踪信息被追加到该页中。正 如您所知,ASP.NET 页通过处理它从 HttpRuntime 环境接收的事件工作。这些事件描述了页的 生命周期,并且通过少数状况(包括 Page_Load Page_PreRender)从Page_Init 移动到 Page_Unload。当生成最后一个事件时,浏览器的 HTML 代码尚未准备好。当该页呈现时,HTML 被临时缓存在输出流中,并且留待已注册的模块进一步处理。因此,该页中的代码甚至无法访问 作为跟踪输出附加的 HTML 信息。这种封闭的结构再加上我对于乏味的基于文本的用户界面的 厌恶,促使我去寻求一种替代方案。 在讨论 MyTracer 之前,我应当概括性地对跟踪进行一点说明。尽管您应当十分小心,不要在 部署页时启用跟踪属性,但可以在代码中保留跟踪调用以供将来使用。实际上,如果未启用跟踪, Warn方法都会立即返回。这可能会对性能产生影响,但是可以忽略,尤其是由于 可以声明性地启用跟踪机制,而无须改动代码。通过简单地在 web.config 文件中更改跟踪语句 enabled属性,就可以通过查看器启用跟踪。 这样,就可以在某个用户反馈之后监视应用程 序,而无须停止它。尽管如此,为了使查看器正常工作,必须有条件地发出跟踪信息。 MyTracer 工具 还有其他几种在 ASP.NET 1.x 中编写替代跟踪程序工具的方式。可以将其编写为 HTTP 模块, 并且同时使用 HttpApplication 事件和 ASP.NET 对象模型来收集要显示的运行库信息。此外, 可以让它公开方法和事件以便与该页交互。在本专栏中,我将推荐一种不同的方法,该方法利用 Windows 窗体应用程序的丰富的用户界面并且与 Visual Studio .NET 集成。在完成一切工作之 后,MyTracer 将是一个 Windows 窗体程序,它嵌入了 WebBrowser ActiveX 控件以显示 Web 页,并且使用 Web 服务作为 ASP.NET Windows之间的桥梁。图 显示了正在对示例页执行操作的这一工具。 MyTracer工具 该工具导航到指定页并显示该页。如果已经将该页配置为使用 MyTracer,则会导出某些特定于 该页的信息,并且将这些信息提供给与应用程序位于同一虚拟文件夹中的 Helper Web 服务。 Windows 窗体应用程序处理 DocumentComplete 事件,并且在准备好以后连接到 Web 服务 以下载 ASP.NET 运行库信息。之后,它只是用特定于页的数据(例如,Session、Application、 Cache、视图状态、输入表单、服务器变量甚至该页中的服务器控件列表)填充各种选项卡。 MyTracer 包含三个组件:图 中显示的Windows窗体程序、前面提到的 Web 服务以及被跟 踪的页必须包含的 Web 用户控件。用户控件 挂钩页生命周期中的关键事件并且将信息存储到 DataSet 对象中。当该页上载时,DataSet 以非常类似于 ASP.NET 话状态的SQL Server? 实现的方式复制到数据库中。Web 服务检索该数据库中的任何数据,并 且将这些数据序列化到 Windows 窗体应用程序中。数据总是作为一个在用户界面的每个选项 卡中都有一个子表的 DataSet 进行传播。数据库和 Web 服务各自都具有非常简单的结构。特 别地,DataSet 被保留为 XML DiffGram,以便作为字符串对待和移动。图 MyTracer体系结构 启用MyTracer 要进行跟踪,页必须包含 MyDebugTool 用户控件。 该控件具有简单的用户界面,以告诉用户 该工具正在操作。(请参见本文顶部的链接。)该控件挂钩 Page_Unload Session)。数据容器是一个 DataSet 对象,它在控件的构造函数内部实例化asp调试器,并且在通知控件该页将要卸载时被 存留到 SQL Server 数据库中,以作为最后一个操作。给定现有的 ASP.NET 页,要启用 MyTracer,则必须注册 MyDebugTool 控件并将其添加到控件集合中。用户控件是通过 @Register 指令注册的: 请注意,TagPrefix TagName可以取任何值,并且用户控件必须与应用程序驻留在同一 Web 域中。您可以将该控件的实例放在该页中的任何地方,甚至可以放在最顶端。 (编辑:百科站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
站长推荐

