我花了一段时间才能做到这一点,所以我决定分享一个解决方案,因为它可能会为其他人节省几天的反复试验。
问题:我希望能够在我的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";
我从这个论坛中获得了很大的好处,我希望这篇文章可以向前推进!
请参阅Specifying Fully Qualified Type Names,以便在.config文件中正确设置“type”。