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