一种方法是使用 C 代码中定义的自定义侦听器

我花了一段时间才能做到这一点,所以我决定分享一个解决方案,因为它可能会为其他人节省几天的反复试验。

问题:我希望能够在我的 C#.NET 应用程序中启用/禁用 WCF 跟踪并选择跟踪输出文件名。我不希望用户编辑 .config 文件,那里有太多的错误空间。

这是一个解决方案。

应用程序的 .config 文件:

<?xml version="1.0"?>
<configuration>
  <system.diagnostics>
    <trace autoflush="true"/>
    <sources>
      <source name="System.ServiceModel" switchValue="All">
        <listeners>
          <add name="MyListener"/>
        </listeners>
      </source>
      <source name="System.ServiceModel.MessageLogging" switchValue="All">
        <listeners>
          <add name="MyListener"/>
        </listeners>
      </source>
      <source name="System.ServiceModel.Activation" switchValue="All">
        <listeners>
          <add name="MyListener"/>
        </listeners>
      </source>
      <source name="System.IdentityModel" switchValue="All">
        <listeners>
          <add name="MyListener"/>
        </listeners>
      </source>
    </sources>
    <sharedListeners>
      <add name="MyListener" type="MyNamespace.MyXmlListener, MyAssembly"/>
    </sharedListeners>
  </system.diagnostics>
  <system.serviceModel>
    <diagnostics wmiProviderEnabled="true">
      <messageLogging
        logEntireMessage="true"
        logMalformedMessages="true"
        logMessagesAtServiceLevel="true"
        logMessagesAtTransportLevel="true"
        maxMessagesToLog="1000"
        maxSizeOfMessageToLog="8192"/>
    </diagnostics>
  </system.serviceModel>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
  </startup>
</configuration>

和 C#代码:

using System;
using System.IO;
using System.Diagnostics;
namespace MyNamespace
{
    public class MyXmlListener : XmlWriterTraceListener
    {
        public static String TraceOutputFilename = String.Empty;

        public static Stream MakeOutputStream()
        {
            if (String.IsNullOrWhiteSpace(TraceOutputFilename))
                return Stream.Null;

            return new FileStream(TraceOutputFilename, FileMode.Create);
        }

        public MyXmlListener ()
            : base(MakeOutputStream())
        { }
    }
}

要启用 WCF 跟踪到文件,请在创建 WCF 对象之前设置 TraceOutputFilename:

MyXmlListener.TraceOutputFilename = "trace.svclog";

我从这个论坛中获得了很大的好处,我希望这篇文章能够为此付出一些代价。

在 .config 文件中获取类型比在应用程序中更具挑战性,请参阅指定完全限定类型名称以在 .config 文件中正确设置类型