2009-12-18 24 views
14

¿Cuál es la mejor forma de detectar y registrar errores al desarrollar una capa de servicio WCF, y por qué?La mejor forma de registrar errores en WCF

puedo pensar en tres maneras,

1) Manual de try/capturas alrededor de cada método.

2) Deje la responsabilidad al motor WCF.

3) Utilice una biblioteca de terceros como Enterprise Library Policy Injection/Logging.

+1

Consulte el siguiente enlace para configurar log4net con WCF. En cada webmethod puede agregar información de solicitud y respuesta al archivo de registro. [http://paulthecyclist.com/tag/log4net/](http://paulthecyclist.com/tag/log4net/) – shazia

+0

Gracias por el enlace Shazia. El enlace real debería ser: http://paulthecyclist.com/2012/04/06/catch-all-wcf-errors/ though. – PaulTheCyclist

Respuesta

22

Me gustaría poner en práctica la costumbre IErrorHandler y utilizar log4net

[AttributeUsage (AttributeTargets.Interface)] 
public class ErrorPolicyBehaviorAttribute : Attribute, IContractBehavior, IErrorHandler 
    { 
    private ILog m_logger; 

    #region IErrorHandler 

    public void ProvideFault (Exception error, MessageVersion version, ref Message fault) 
     { 
     return; 
     } 

    public bool HandleError (Exception error) 
     { 
     m_logger.Error (error.Message, error); 
     return true; 
     } 

    #endregion 

    #region IContractBehavior 

    public void ApplyDispatchBehavior (ContractDescription contractDescription, ServiceEndpoint endpoint, DispatchRuntime dispatchRuntime) 
     { 
     ...init logger 
     ......Add this class to a list of dispatchRuntime.ChannelDispatcher.ErrorHandlers... 
     } 

    #endregion 
    } 

Esta clase también implementa IContractBehavior, por lo que puede usarlo como atributo en sus contratos de servicio.

[ErrorPolicyBehavior] 
public interface IYourServiceContract 
{ } 

log4net es bastante flexible, por lo que puede registrar lo que necesita y cuando lo necesita.

+4

Prefiero usar el rastreo de .NET: ya está integrado en .NET Framework, y es una dependencia menos de un componente externo. –

+2

@marc_s. Desde .NET 1.1 me acostumbré a log4net, ya que ofrece mucha más flexibilidad que el rastreo estándar de .NET. Una pequeña y de código abierto (significa que puedes arreglar errores allí si encuentras alguna) dependencia de lib no es un gran problema. – fspirit

+0

@fspirit, podría proporcionar el código completo de su demostración. Implementé el mismo código e introduje la excepción DividedByZero en uno de mis métodos contractuales. Sin embargo, el punto de interrupción nunca llega al método Handle Error. – Elangesh

1

Me gustaría ir con el número 1. Principalmente debido a la sobrecarga reducida sobre el número 3 y el número 2 debería ser simplemente un no-no.

Concedido, todavía desea iniciar sesión en algo decir como un administrador de archivos o eventos. Pero personalmente usaría log4net para él, ya que es un poco más ligero que todas las cosas de entlib.

+1

número 1 es solo una opción si está esperando algún otro lanzamiento de código y excepción y desea manejarlo para el usuario de alguna manera. Las excepciones no controladas son siempre una posibilidad en .NET. Considere cuándo la excepción es presentada por el servicio antes de que el método tenga la oportunidad de llamar.Poniendo un try {...} catch (Exception e) {LogException (e)} Parece que estás ensuciando tu código con la lógica que mejor podría manejarse en una ubicación central. – Rob

+0

Tiendo a estar de acuerdo, intente capturar registro es una forma bastante hinchada para resolver el problema, especialmente cuando un comportamiento de error podría resolver esto. La audiencia también puede querer mirar el AOP, un estilo para evitar este estilo repetitivo de codificación: http://en.wikipedia.org/wiki/Aspect-orientted_programming. Los comportamientos son una forma de introducir estos conceptos cuando utilizo WCF – RhysC

2

Valdría la pena echarle un vistazo log4net. Hay un buen tutorial aquí en CodeProject.

+0

. Prefiero usar el rastreo de .NET: ya está integrado en .NET Framework, y es una dependencia menos de un componente externo. –

+1

También me gustó este tutorial de log4net. Muy completo http://www.beefycode.com/category/log4net.aspx – ram

9

WCF se puede configurar para generar trazas de hitos del proceso en todos los componentes de las aplicaciones, como llamadas de operación, excepciones de código, advertencias y otros eventos de procesamiento significativos.

El siguiente es un ejemplo de app.config para habilitar el seguimiento.

<configuration> 
    <system.diagnostics> 
    <sources> 
     <source name="System.ServiceModel" switchValue="Warning" propagateActivity="true" > 
     <listeners> 
      <add name="xml"/> 
     </listeners> 
     </source> 

     <source name="myUserTraceSource" switchValue="Warning, ActivityTracing"> 
     <listeners> 
      <add name="xml"/> 
     </listeners> 
     </source> 
    </sources> 

    <sharedListeners> 
     <add name="xml" 
      type="System.Diagnostics.XmlWriterTraceListener" 
      initializeData="TraceLog.svclog" /> 
    </sharedListeners> 

    </system.diagnostics> 
</configuration> 

Puede leer más sobre WCF Rastreo de MSDN: Configuring Tracing.

Microsoft proporciona un Service Trace Viewer Tool para leer archivos .svclog.

Además del rastreo, es posible que desee considerar el uso de log4net para el registro en la aplicación.

+1

si ya ha configurado el rastreo de .NET, ¿por qué no utilizar esa funcionalidad para el registro de aplicaciones también? Elimina otra de esas molestas dependencias en los componentes externos, y funciona muy bien –

+1

@marc_s: gracias por la sugerencia. Sin embargo, ¿seguiría utilizando el seguimiento de .NET para registrar eventos que no sean errores: como 'acceso hits'? ... ¿y aplicarías el mismo razonamiento para el entorno en vivo? –

2

Si está solicitando un marco de registro ELMAH también es una buena opción a considerar. Si no te gusta a la basura su código con try/catch alrededor de cada método, se puede tratar de usar AOP frameworks lo que le daría la capacidad de manejar excepciones marcando el método con los atributos

+0

Hemos tenido éxito usando AoP a través del Interceptor de Interfaz Unity. Una pequeña curva de aprendizaje, especialmente en torno al manejo de excepciones, pero ahora tenemos un gran bloque de código reutilizable que registra todas nuestras E/S WCF a nivel de información (a través de log4net) –

+0

¡¡¡buena respuesta Richard !! Lo agregaré a mi lista "para aprender" – ram

Cuestiones relacionadas