2010-03-04 2 views
24

Stiamo sviluppando un proxy in WCF che fungerà da mezzo di comunicazione per alcuni palmari che eseguono la nostra applicazione client personalizzata. Sono curioso di sapere quali strategie di gestione degli errori le persone usano come preferisco non avvolgere OGNI chiamata proxy in try/catch.Strategie di gestione delle eccezioni WCF

quando sviluppo ASP .NET I dont prendere la maggior parte delle eccezioni, ho Leverage Application_Error in ASax globale che possono quindi accedere eccezione, inviare una mail, e reindirizzare l'utente a una pagina di destinazione di errore personalizzato. Quello che sto cercando in WCF è simile a questo, tranne che mi permetterebbe di passare una generale faultreason al client da una posizione centrale.

Fondamentalmente sono curioso di sapere come le persone centralizzano la gestione delle eccezioni nelle app WCF.

Grazie

+0

Domanda importante: si stanno utilizzando guasti personalizzati/contratti di guasto? – Aaronaught

risposta

22

È possibile che l'interfaccia IErrorHandler sia utile qui. Lo stiamo usando per fare più o meno ciò che si menziona: la registrazione centralizzata delle eccezioni e la fornitura di motivi di errore generalizzati senza dover sparpagliare il codice con numerosi try/catch per provare a gestire il problema localmente.

+1

Sì, questo è in effetti esattamente quello che stavo cercando, ha preso del lavoro per farlo funzionare (vedi sotto) ma è 100% quello che mi serve – xximjasonxx

+0

qualsiasi esempio semplice è apprezzato – sll

+1

Qui puoi trovare un'implementazione di esempio di IErrorHandler - http: //www.neovolve.com/post/2008/04/07/implementing-ierrorhandler.aspx –

2

Usiamo la Gestione delle eccezioni di blocco delle applicazioni e proteggere la maggior parte dei guasti da parte dei clienti per evitare di divulgare informazioni sensibili, questo article potrebbe essere un buon punto di partenza per voi, come con le "migliori pratiche" - si dovrebbe usare ciò che si adatta al tuo dominio

15

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.

+0

Se ho capito bene, entrambi avevamo lo stesso obiettivo. Ecco come l'ho affrontato. http://stackoverflow.com/questions/6356669/wcf-exception-throwing-and-handling-the-oop-way Cosa ne pensi di questo modo? – user20358