2010-03-04 18 views
24

Estamos desarrollando un proxy en WCF que servirá como medio de comunicación para algunas computadoras de mano que ejecutan nuestra aplicación cliente personalizada. Tengo curiosidad por saber qué estrategias de manejo de errores usan las personas, ya que prefiero no ajustar TODAS las llamadas de proxy en try/catch.WCF Estrategias de manejo de excepciones

Cuando desarrollo ASP .NET no capto la mayoría de las excepciones, aprovecho Application_Error en Global asax, que luego puede registrar la excepción, enviar un correo electrónico y redirigir al usuario a una página de inicio de error personalizada. Lo que estoy buscando en WCF es similar a esto, excepto que me permitiría pasar una cuestión de falta general al cliente desde una ubicación central.

Básicamente me llama la atención cómo las personas centralizan su manejo de excepciones en las aplicaciones WCF.

Gracias

+0

Pregunta importante: ¿Está utilizando contratos personalizados de fallas/fallas? – Aaronaught

Respuesta

22

Puede encontrar la interfaz IErrorHandler útil aquí. Hemos estado usando esto para hacer más o menos lo que usted menciona: registro de excepciones centralizado y proporcionar razones de falla generalizadas sin tener que ensuciar el código con numerosos intentos/capturas para tratar de resolver el problema localmente.

+1

Sí, esto es exactamente lo que estaba buscando, tomó algo de trabajo para ponerlo en funcionamiento (ver abajo) pero es 100% lo que necesito – xximjasonxx

+0

se aprecia cualquier ejemplo simple – sll

+1

Puede encontrar una implementación de ejemplo de IErrorHandler aquí - http: //www.neovolve.com/post/2008/04/07/implementing-ierrorhandler.aspx –

2

Usamos el manejo de excepciones bloque de aplicación y proteger a la mayoría de los fallos de los clientes para evitar la divulgación de información sensible, esta article podrían ser un buen punto de partida para que, al igual que con las "mejores prácticas" - se debe utilizar lo se adapta a tu dominio

15

Así que aquí está lo que hice. Tenemos algunas excepciones personalizadas en nuestra aplicación, como BusinessRuleException y ProcessException, WCF admite FaultException y FaultException<T>.

La práctica general parece ser que siempre arroja FaultException al cliente en el caso de un error general o un error que no desea mostrar exactamente lo que sucedió. En otros casos, puede pasar FaultException<T> donde T es una clase con información sobre la excepción en particular.

Creé este concepto de violaciones en la aplicación, lo que básicamente significaba que cualquier excepción personalizada tenía una propiedad que contenía la instancia de infracción correspondiente. Esta instancia se pasó luego al cliente, lo que permitió al cliente reconocer cuándo se había producido un error recuperable.

Esto resolvió parte del problema, pero yo todavía quería una captura general de todo lo que me permitiría centrar el registro. Encontré esto usando la interfaz IErrorHandle y agregando mi propio manejador de error personalizado a WCF. Aquí está el código:

public class ServiceHostGeneralErrorHandler : IErrorHandler 
{ 
    public void ProvideFault(Exception ex, MessageVersion version, ref Message fault) 
    { 
     if (ex is FaultException) 
      return; 

     // a general message to the client 
     var faultException = new FaultException("A General Error Occured"); 
     MessageFault messageFault = faultException.CreateMessageFault(); 
     fault = Message.CreateMessage(version, messageFault, null); 
    } 

    public bool HandleError(Exception ex) 
    { 
     // log the exception 

     // mark as handled 
     return true; 
    } 
} 

Usando este método, puedo convertir la excepción de lo que sea a algo que se puede visualizar fácilmente en el cliente, mientras que al mismo tiempo registrar la excepción real para el personal de TI para ver . Hasta ahora, este enfoque funciona bastante bien y sigue la misma estructura que otros módulos en la aplicación.

+0

Si entendí correctamente, ambos teníamos el mismo objetivo. Así es como lo abordé. http://stackoverflow.com/questions/6356669/wcf-exception-throwing-and-handling-the-oop-way ¿Qué piensas de esa manera? – user20358