WCF 分析跟踪
WCFAnalyticTracingExtensibility 示例演示如何将自己的跟踪事件添加到 Windows Communication Foundation (WCF) 写入 .NET Framework 中的 ETW 的分析跟踪的流。 跟踪分析是为了便于查看服务,而不会导致较高性能损失。 此示例演示如何使用 System.Diagnostics.Eventing API 来写入与 WCF 服务集成的事件。
有关 System.Diagnostics.Eventing API 的详细信息,请参阅 System.Diagnostics.Eventing。
若要了解有关 Windows 中事件跟踪的更多信息,请参见使用 ETW 改善调试和性能优化。
释放 EventProvider
此示例使用 System.Diagnostics.Eventing.EventProvider 类,该类实现 System.IDisposable。 在实现 WCF 服务的跟踪时,可以针对服务的生存期使用 EventProvider 的资源。 因此,为了便于阅读,此示例永远不会释放已包装的 EventProvider。 如果出于某种原因,您的服务具有不同的跟踪需求,并且必须释放此资源,则应根据释放非托管资源的最佳做法来修改此示例。 有关释放非托管资源的详细信息,请参阅实现 Dispose 方法。
自承载与 Web 承载
对于 Web 承载的服务,WCF 的分析跟踪提供了一个名为“HostReference”的字段,该字段用于标识发出这些跟踪的服务。 可扩展的用户跟踪可以参与此模型,此示例演示执行该操作的最佳做法。 当竖线字符“|”实际显示在生成的字符串中时,Web 宿主引用的格式可以是下面任何一种:
如果该应用程序不在根处。
<SiteName><ApplicationVirtualPath>|<ServiceVirtualPath>|<ServiceName>
如果该应用程序在根处。
<SiteName>|<ServiceVirtualPath>|<ServiceName>
对于自承载服务,WCF 的分析跟踪不会填充“HostReference”字段。 此示例中的 WCFUserEventProvider
类在由自承载服务使用时,其行为是一致的。
自定义事件详细信息
WCF 的 ETW 事件提供程序清单定义了三个事件,这些事件设计为由 WCF 服务作者在服务代码内发出。 下表显示了这三个事件的分类。
事件 | 说明 | 事件 ID |
---|---|---|
UserDefinedInformationEventOccurred | 服务中发生的说明内容不是一个问题时发出此事件。 例如,可以在对数据库成功进行调用后发出一个事件。 | 301 |
UserDefinedWarningOccurred | 发生的问题可能导致将来出现错误时发出此事件。 例如,如果调用数据库失败,但能够通过回退到冗余数据存储区进行恢复,则可以发出一个警告事件。 | 302 |
UserDefinedErrorOccurred | 服务的行为方式不符合预期时发出此事件。 例如,如果调用数据库失败且无法从其他位置检索数据,则可能会发出一个事件。 | 303 |
使用此示例
使用 Visual Studio 打开 WCFAnalyticTracingExtensibility.sln 解决方案文件。
若要生成解决方案,请按 ++。
若要运行解决方案,请按 Ctrl+F5。
在 Web 浏览器中,单击“Calculator.svc”。 服务的 WSDL 文档的 URI 应出现在浏览器中。 复制该 URI。
运行 WCF 测试客户端 (WcfTestClient.exe)。
WCF 测试客户端 (WcfTestClient.exe) 位于
\<Visual Studio Install Dir>\Common7\IDE\WcfTestClient.exe
。在 WCF 测试客户端中,选择“文件”,然后选择“添加服务”来添加服务。
在输入框中添加终结点地址。
单击“确定”,关闭对话框。
ICalculator 服务将添加到“我的服务项目”下的左窗格中。
打开事件查看器应用程序。
在调用服务之前,请启动事件查看器并确保事件日志正在侦听从 WCF 服务发出的跟踪事件。
在“开始”菜单中,选择“管理工具”,然后选择“事件查看器”。 启用“分析”和“调试”日志。
在事件查看器的树视图中,依次导航到“事件查看器”、“应用程序和服务日志”、“Microsoft”、“Windows”和“应用程序服务器 - 应用程序”。 右键单击“应用程序服务器 - 应用程序”,选择“查看”,然后选择“显示分析和调试日志”。
确保已选中“显示分析和调试日志”选项。 启用“分析”日志。
在事件查看器的树视图中,导航到“事件查看器”、“应用程序和服务日志”、“Microsoft”、“Windows”、“应用程序服务器-应用程序”、“分析”。 右键单击“分析”,然后选择“启用日志”。
使用 WCF 测试客户端来测试服务。
在 WCF 测试客户端中,双击 ICalculator 服务节点下的“Add()”。
“Add()”方法将显示在右窗格中(带有两个参数)。
为第一个参数键入 2,为第二个参数键入 3。
单击“调用”调用该方法。
转到已经打开的“事件查看器”窗口。 导航到“事件查看器”、“应用程序和服务日志”、“Microsoft”、“Windows”、“应用程序服务器-应用程序”。
右击“分析”节点并选择“刷新”。
事件将显示在右窗格中。
使用 ID 303 来查找事件,然后双击该事件将其打开,并检查其内容。
此事件是由 ICalculator 服务的
Add()
方法发出的,并且具有一个负载等于“2+3=5”的负载。
清理(可选)
打开“事件查看器”。
依次导航到“事件查看器”、“应用程序和服务日志”、“Microsoft”、“Windows”和“应用程序 - 服务器 - 应用程序”。 右键单击“分析”,然后选择“禁用日志”。
导航到“事件查看器”、“应用程序和服务日志”、“Microsoft”、“Windows”、“应用程序服务器-应用程序”、“分析”。 右键单击“分析”,然后选择“清除日志”。
单击“清除”清除这些事件。
已知问题
事件查看器中存在一个已知问题,即可能无法解码 ETW 事件。 您可能会看到一条错误消息:“无法找到源“Microsoft-Windows-应用程序服务器-应用程序”中事件 ID <id> 的说明。 未在本地计算机上安装引发此事件的组件,或者安装已损坏。 可以安装或修复本地计算机上的组件。”如果遇到此错误,请从“操作”菜单中选择“刷新”。 然后,该事件应能正确解码。