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.
Pregunta importante: ¿Está utilizando contratos personalizados de fallas/fallas? – Aaronaught