Cómo: deshabilitar / habilitar el seguimiento de WCF en el código de la aplicación C #

Me tomó un tiempo hacer esto bien, así que decidí compartir una solución porque podría ahorrarle a otra persona varios días de prueba y error.

El problema: quiero poder habilitar / deshabilitar el rastreo de WCF en mi aplicación C # .NET y elegir el nombre de archivo de salida de rastreo. No quiero que los usuarios editen el archivo .config, hay demasiado margen de error allí.

Aquí hay una solución.

El archivo .config de la aplicación:

<?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>

Mi código 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())
        { }
    }
}

Para habilitar el rastreo de WCF en un archivo, establezca TraceOutputFilename antes de crear el objeto WCF:

MyXmlListener.TraceOutputFilename = "trace.svclog";

He obtenido grandes beneficios de este foro, ¡espero que esta publicación lo pague!

VerEspecificar nombres de tipo totalmente calificados para configurar el "tipo" correctamente en un archivo .config.

Respuestas a la pregunta(0)

Su respuesta a la pregunta