使用 WCF 创建实时跟踪侦听器
无需从文件中读取跟踪消息,通过 WCF 即可在 WPF 应用程序中实时获取它们。
引言
这是一个可以通过网络使用的跟踪侦听器。 也就是说,如果您的应用程序中写入了跟踪消息,并且希望通过网络侦听它们,您可以在应用程序的 bin 目录中添加一个 DLL,在配置文件中添加几行,然后就可以进行远程侦听了。
背景
我搜索了一些类似的文章,上面的文章比较接近,但需要在正在开发的项目中包含它。 我希望能够运行一个原始的生产服务,而无需任何用于调试的附加内容,然后,如果需要,放入一个 DLL 和一些配置条目,以便能够侦听它。
因此,我不太担心性能。 也就是说,我使用了 OneWay WCF 属性,因此它在写入每个跟踪时不会等待响应,它只是转储消息并继续。
使用代码
好消息是,为了使用它,您只需要在您的配置文件中使用类似于下面的代码
<system.diagnostics>
<trace autoflush="true" indentsize="4">
<listeners>
<add name="NetworkTraceListener"
type="NetworkTraceListener.TraceClient, NetworkTraceListener"/>
</listeners>
</trace>
</system.diagnostics>
<!--WCF config for NetworkTraceListener, pointing to viewer-->
<system.serviceModel>
<client>
<endpoint
address="net.tcp://:8001/NetworkTraceListenerViewer/service"
binding="netTcpBinding" contract="ITraceServer" />
</client>
</system.serviceModel>
关注点
您需要 NUnit 4.0 来编译解决方案 - 或删除测试项目。 要使用它,请启动作为查看器和服务器的 WPF 应用程序,然后将上述内容和编译后的 NetworkTraceListener.dll 包含在您想要侦听的项目中。 您应该在查看器应用程序中看到消息。
我使用了 TraceServer
上的一个静态 Start
和 Stop
方法而不是一个实例。 这是为了方便快速启动此功能。 如果我使用实例类,我将需要某种方式从 WCF 实例获取事件到用于启动/停止的单独实例。 我没有预见到在同一进程中需要多个查看器的情况,所以这似乎是简单的方法。
TraceClient
做了一些不寻常的事情,即它会吃掉所有异常。 我从不想因为通信失败、侦听器被关闭等原因导致应用程序失败,而我只想侦听跟踪消息。 我没有记录这些问题,因为我对它们不感兴趣,而且过去尝试在跟踪侦听器中进行额外的写入给我带来了一些问题。
WCF 非常易于使用 - 我对设置网络功能是如此简单,而无需过多地处理端口和套接字等内容感到非常满意。
这是单元测试,它确认可以实例化一个服务器,客户端可以编写几条消息,并且它们被接收
[Test]
public void TestSingleStartStopWithSendOk()
{
int MessageCount = 0;
try
{
AutoResetEvent ServerStartWait = new AutoResetEvent(false);
TraceServer.ServiceListening +=
new TraceServer.ServiceListeningType(delegate(object o, EventArgs e) {
ServerStartWait.Set();
});
TraceServer.Start();
TraceServer.MessageReceived +=
new TraceServer.MessageReceivedType(delegate (string Message) {
MessageCount++;
});
//wait for server to start w/ timeout of 20 seconds
ServerStartWait.WaitOne(20000, true);
TraceClient client = new TraceClient();
client.WriteLine("test1");
client.WriteLine("test2");
client.Flush();
//allow time for messages to be sent before forcing connection closed
Thread.Sleep(1000);
client.Close();
}
finally
{
TraceServer.Stop();
}
Assert.AreEqual(2, MessageCount);
}
待办事项
添加一个“无用的动画”复选框,启用星际大战风格的滚动跟踪消息。 可能还有“无用的音频”复选框,带有主题音乐。
历史
- 2008 年 2 月 17 日 - 初始版本。