一種方法是使用 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 檔案中正確設定型別