In pratica sto implementando l'interfaccia IErrorHandler
per catturare tutti i tipi di eccezioni dal servizio WCF e inviarlo al client implementando il metodo ProvideFault
.Gestione delle eccezioni WCF tramite IErrorHandler
Tuttavia, sto affrontando un problema critico. Tutte le eccezioni vengono inviate al client come FaultException
ma ciò disabilita il client per gestire eccezioni specifiche che potrebbe aver definito nel servizio.
Considerare: SomeException
che è stato definito e lanciato in una delle implementazioni OperationContract
. Quando viene generata l'eccezione, la sua trasformato in un errore utilizzando il seguente codice:
var faultException = new FaultException(error.Message);
MessageFault messageFault = faultException.CreateMessageFault();
fault = Message.CreateMessage(version, messageFault, faultException.Action);
Ciò inviare l'errore come una stringa, ma il cliente deve prendere una deroga generale come:
try{...}
catch(Exception e){...}
e non:
try{...}
catch(SomeException e){...}
non solo eccezioni personalizzate come SomeException, ma le eccezioni di sistema come InvalidOperationException non possono essere catturati utilizzando il processo di cui sopra.
Qualche idea su come implementare questo comportamento?
quale metodo fuoco dopo HandleError? – KumarHarsh
Posso collegare un gestore errori solo sul lato client? Voglio collegarlo all'implementazione 'ClientBase ', piuttosto al livello di servizio, è possibile? –
Shimmy
Sicuro. Io uso un metodo di supporto, qualcosa del genere: var factory = new ChannelFactory (binding, endpointAddress); factory.Endpoint.EndpointBehaviors.Add (new PassthroughExceptionHandlingBehavior()); return factory.CreateChannel(); –