Quindi ecco cosa ho fatto. Abbiamo alcune eccezioni personalizzate nella nostra applicazione come BusinessRuleException e ProcessException, WCF supporta sia FaultException che FaultException<T>
.
La pratica generale sembra essere che si lancia sempre FaultException al client in caso di un errore generale o di un errore che non si desidera visualizzare esattamente quello che è successo. In altri casi è possibile passare FaultException<T>
dove T è una classe con informazioni sulla particolare eccezione.
Ho creato questo concetto di Violazioni nell'applicazione, che in pratica significava che qualsiasi eccezione personalizzata aveva una proprietà contenente l'istanza di violazione corrispondente. Questa istanza è stata quindi passata al client consentendo al client di riconoscere quando si è verificato un errore recuperabile.
Questa parte risolta del problema, ma volevo ancora una presa generale che mi permettesse di centralizzare la registrazione. Ho trovato questo utilizzando l'interfaccia IErrorHandle e aggiungendo il mio gestore degli errori personalizzato a WCF. Ecco il codice:
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;
}
}
Utilizzando questo metodo, posso convertire l'eccezione da qualunque cosa sia a qualcosa che può essere facilmente visualizzato sul client, mentre allo stesso tempo la registrazione della vera eccezione per il personale IT di vedere . Finora questo approccio funziona abbastanza bene e segue la stessa struttura degli altri moduli nell'applicazione.
Domanda importante: si stanno utilizzando guasti personalizzati/contratti di guasto? – Aaronaught