2009-12-18 11 views
12

Ho un'attività in esecuzione su un sistema remoto che si collega a un server tramite WCF. È molto probabile che l'attività possa generare eccezioni e mi piacerebbe che tali eccezioni fossero reindirizzate al server. In sostanza voglio fare qualcosa di simile:Serializzazione delle eccezioni su WCF

Cliente:

server.SendException(new UnauthorizedAccessException("Some Exception")); 

Server:

public void SendException(Exception e) 
{ 
    throw e; 
} 

contratto:

[ServiceContract] 
public interface IServerContract 
{ 
    [OperationContract] 
    void SendException(Exception e); 
} 

ho letto un po 'di colpa eccezioni, ma da quello che ho capito, sono usate per specifiche eccezioni che sono in esecuzione in un metodo chiamato su WCF . Quello che voglio è inviare qualsiasi tipo di eccezione che l'applicazione ha gettato al di fuori del contesto WCF e quindi reindirizzare al server per un'ulteriore elaborazione. Se aiuta in una soluzione, il server ha anche una connessione al client.

+0

Quindi, in pratica, se il client genera un'eccezione, si desidera che venga registrata sul server? –

+0

Potrebbe essere possibile, ma penso che potrebbe essere necessario fornire maggiori dettagli sulla catena di comunicazione tra i servizi, i client e le applicazioni? Potrebbe aiutarti a ottenere una risposta solida da qualcuno. È un po 'difficile seguire esattamente ciò di cui hai bisogno. –

risposta

10

È necessario rilevare le eccezioni sul server e comprimerle negli errori SOAP per inviarle nuovamente sul cavo. Altrimenti, il tuo canale client-server sarà "messo in errore" e inutilizzabile.

Un errore SOAP è fondamentalmente l'equivalente SOAP interoperabile di un'eccezione .NET. Non si presuppone che tu crei eccezioni .NET a causa del fatto che sono specifiche di .NET - WCF e SOA sono per definizione indipendenti dal sistema.

Se entrambe le estremità del cavo di comunicazione sono infatti garantiti per essere NET, si può facilmente concludere alcuna eccezione .NET in un FaultException<T> e quindi facilmente canale di ritorno .NET informazioni specifiche eccezioni usando un sapone compliant "mezzo di trasporto".

documentarsi più errori SOAP e su come trasformare il vostro eccezioni .NET sul server in errori SOAP sul filo qui:

+1

Questo è quello che ho trovato più punti di dire, purtroppo ho bisogno che vada nella direzione opposta, perché sto cercando di rilevare le eccezioni dei client e inviarli al server. – MGSoto

+2

Bene, usa lo stesso meccanismo: crea un metodo di servizio, ad es. "ReceiveFault" e imposta i parametri come "FaultException ". Ora, dal client, quando qualcosa va storto, avvolgere l'eccezione .NET in una FaultException e chiamare "ReceiveFault" sul server –

+0

Mentre il metodo scelto ha funzionato, questo è probabilmente il modo più corretto per farlo. – MGSoto

6

Per quello che mi serviva, ho risolto il mio problema. Ho usato la classe ExceptionDetail come fornita da ServiceModel e l'ho usata per inviare i dati di eccezione rilevanti al server.

+0

È passato un po 'di tempo da quando hai postato questo, ma pensavo di farti sapere che finalmente ho trovato un modo per farlo. Soluzione [qui] (http://stackoverflow.com/a/28737527/722393). Come indicato, 'ExceptionDetail' può funzionare, ma solo nei casi in cui il server non abbia bisogno di un oggetto' Exception' deserializzato. Questo qualcosa in più lo copre. – InteXX