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 方法。
Self-Hosting 与 Web 托管
对于 Web 托管服务,WCF 的分析跟踪提供一个名为“HostReference”的字段,该字段用于标识发出跟踪的服务。 可扩展用户跟踪可以参与此模型,此示例演示了执行此作的最佳做法。 当生成的字符串中实际出现管道符“|”时,Web 主机引用的格式可以是以下任一:
如果应用程序不在根目录中。
<SiteName><ApplicationVirtualPath> |<ServiceVirtualPath> |<ServiceName>
如果应用程序位于根目录中。
<SiteName>|<ServiceVirtualPath> |<ServiceName>
对于自承载服务,WCF 的分析跟踪不会填充“HostReference”字段。 此示例中的 WCFUserEventProvider
类在由自承载服务使用时,其行为是一致的。
自定义事件详细信息
WCF 的 ETW 事件提供程序清单定义了三个事件,这些事件旨在由 WCF 服务作者从服务代码中发出。 下表显示了三个事件的细分。
事件 / 活动 | DESCRIPTION | 事件编号 |
---|---|---|
用户定义的信息事件已发生 | 服务中发生的说明内容不是一个问题时发出此事件。 例如,在成功调用数据库后,可能会发出事件。 | 301 |
用户定义警告已发生 | 发生的问题可能导致将来出现错误时发出此事件。 例如,在调用数据库失败时,可能会发出警告事件,但可以通过回退到冗余数据存储来恢复。 | 302 |
用户定义错误发生 | 当服务无法按预期运行时发出此事件。 例如,如果对数据库的调用失败,并且无法从其他位置检索数据,则可能会发出事件。 | 303 |
使用此示例
使用 Visual Studio 打开WCFAnalyticTracingExtensibility.sln解决方案文件。
若要生成解决方案,请按 Ctrl+Shift+B。
若要运行解决方案,请按 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 和 Application Server-Applications。 右键单击 “应用程序服务器-应用程序”,选择“ 查看”,然后 显示分析和调试日志。
确保选中“ 显示分析和调试日志 ”选项。 启用 分析 日志。
在事件查看器的树视图中,导航到 事件查看器、 应用程序和服务日志、 Microsoft、 Windows、 Application Server-Applications,然后选择 Analytic。 右键单击“分析”,然后选择“启用日志”。
使用 WCF 测试客户端,测试服务。
在 WCF 测试客户端中,双击 ICalculator 服务节点下的 Add()。
Add() 方法显示在右侧窗格中,其中包含两个参数。
为第一个参数键入 2,第二个参数键入 3。
单击 “调用 ”以调用方法。
转到已打开的 事件查看器 窗口。 导航到 事件查看器、 应用程序和服务日志、 Microsoft、 Windows、 Application Server-Applications。
右键单击 “分析 ”节点,然后选择“ 刷新”。
事件显示在右窗格中。
找到 ID 为 303 的事件,然后双击它将其打开并检查其内容。
此事件由
Add()
ICalculator 服务的方法发出,有效负载等于“2+3=5”。
清理(可选)
打开事件查看器。
导航到 事件查看器、 应用程序和服务日志、 Microsoft、 Windows 和 Application-Server-Applications。 右键单击 “分析 ”,然后选择“ 禁用日志”。
导航到 事件查看器、 应用程序和服务日志、 Microsoft、 Windows、 Application-Server-Applications,然后 导航到 Analytic。 右键单击 “分析 ”并选择“ 清除日志”。
单击“ 清除 ”以清除事件。
已知问题
事件查看器中存在一个已知问题,其中可能无法解码 ETW 事件。 您可能会看到一条错误消息:“无法找到源“Microsoft-Windows-应用程序服务器-应用程序”中事件 ID <id> 的说明。 引发此事件的组件未安装在本地计算机上,或者安装已损坏。 可以在本地计算机上安装或修复组件。如果遇到此错误,请从“作”菜单中选择“刷新”。 然后,该事件应能正确解码。