如何过滤/禁用在WCF跟踪中记录的异常?

时间:2013-01-30 17:00:57

标签: c# wcf exception trace

  1. 有没有办法防止在WCF跟踪中记录一类异常?
  2. 更好的是,有没有办法防止一个特殊异常(我的意思是在特定代码行引发一个异常)被记录?
  3. 说明:

    我正在开发两个Windows服务(A)& (B)。在服务(A)上,我在 app.config 文件中启用了WCF跟踪,如下所示:

    <system.diagnostics>
        <sources>
            <source name="System.ServiceModel" switchValue="Warning" 
                    propagateActivity="true">
                <listeners>
                    <add name="traceListener" 
                         type="System.Diagnostics.XmlWriterTraceListener"
                         initializeData="C:\WCF-log.txt" />
                </listeners>
            </source>
        </sources>
    </system.diagnostics>
    

    在这项服务(A)上,我有一些代码用于检测其他服务(B)是否已关闭,如下所示:

    try {
        serviceB.Ping(); // Exception is thrown here when serviceB is down, and 
                         // logged in the C:\WCF-log.txt file
    } catch {
        // Manage failed ping (log...)
    }
    

    现在,服务(B)有时可能会关闭,这是正常的。我希望那些引发异常的内容不会记录在WCF跟踪中,因为它们已被我的应用程序处理,我想要只查看 C:\ WCF-log.txt 文件如果存在“真实”问题。

1 个答案:

答案 0 :(得分:1)

您应该在跟踪侦听器配置中添加过滤器类型,如下所示

<system.diagnostics>
        <sources>
            <source name="System.ServiceModel" switchValue="Warning"
                    propagateActivity="true">
                <listeners >
                    <add name="traceListener"
                         type="System.Diagnostics.XmlWriterTraceListener"
                         initializeData="C:\WCF-log.txt" >
                        <filter type="FilterExceptions"/>
                    </add>                  
                </listeners>
            </source>
        </sources>
    </system.diagnostics>

FilterException类型应继承System.Diagnostics.TraceListener并覆盖ShouldFilter方法,如下所示

 public class FilterExceptions : TraceFilter
    {
        public override bool ShouldTrace(TraceEventCache cache, string source, TraceEventType eventType, int id, string formatOrMessage, object[] args, object data1, object[] data)
        {
            // Add exception filter in below if when event type is error
            if (eventType == TraceEventType.Error)
            {
                return false;
            }

            return true;
        }
    }