2009-10-05 11 views
5

Sto convertendo il codice da ASMX a WCF. Nei miei servizi web ASMX Butto indietro eccezioni SOAP come:Quale tipo di eccezione deve essere generato con un servizio WCF?

if (ex.InnerException != null) 
       { 
        SoapException se = new SoapException(ex.Message, SoapException.ServerFaultCode, Context.Request.Url.AbsoluteUri, ex.InnerException); 
        throw se; 
       } 

Che tipo di eccezioni devo buttare di nuovo a clienti WCF chiamando il mio servizio? Sto indovinando il SOAP exceptin è il tipo sbagliato, perché il client di test non lo vede come un errore valido, e dice solo - errore interno si è verificato nel servizio web.

risposta

20

Fondamentalmente, in un servizio WCF, sei migliore quando lanci solo FaultException (o FaultException<T>).

Questo è dovuto a due cose: poiché WCF è progettato per essere interoperabile (il client potrebbe facilmente essere un'app non.NET), non si dovrebbero usare eccezioni .NET - quelle sono troppo specifiche della piattaforma. E due: se usi FaultExceptions (che sono tradotti in errori SOAP), il tuo canale (la connessione tra client e server) non verrà abbattuto o "guasto". Il runtime di WCF sul lato server considera tutte le eccezioni .NET non gestite come eccezioni "gravi" e quindi mette il canale in uno stato di errore, assumendo che qualcosa di veramente brutto sia successo.

Se il tuo canale è in errore, non puoi più utilizzarlo: dovrai chiudere il proxy client e ricrearlo da zero.

Se si vuole (o deve) essere molto interoperabile, definiresti il ​​tuo errori SOAP sono colpa contratti (analogo ai contratti di dati) in un file separato, e poi ci si butta FaultException<T> dove T sarebbe uno dei tuoi contratti di colpa. Se sei rigorosamente .NET su entrambi i lati, puoi anche aggiungere eccezioni .NET a FaultException come tipo generico T, se lo desideri, il canale non verrà criticato (ad esempio potresti lanciare uno FaultException<InvalidOperationException> e quindi segnalare ciò che è andato sbagliato).

+1

Una grande spiegazione, vorrei poter invocare due volte. Grazie. – Noich

3

In WCF si utilizza FaultException. Vedi ad esempio here.

+0

+1 per condividere un superbo esempio. – SBirthare

Problemi correlati