65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 WCF 创建实时跟踪侦听器

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.21/5 (10投票s)

2008年2月17日

CPOL

2分钟阅读

viewsIcon

41727

downloadIcon

609

无需从文件中读取跟踪消息,通过 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 上的一个静态 StartStop 方法而不是一个实例。 这是为了方便快速启动此功能。 如果我使用实例类,我将需要某种方式从 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 日 - 初始版本。
© . All rights reserved.