Zasadniczo implementuję interfejs IErrorHandler
, aby wychwycić wszystkie rodzaje wyjątków z usługi WCF i przesłać go do klienta za pomocą metody ProvideFault
.Obsługa wyjątków WCF przy użyciu IErrorHandler
Mam jednak do czynienia z jedną krytyczną kwestią. Wszystkie wyjątki są wysyłane do klienta jako FaultException
, ale to wyłącza klienta do obsługi określonych wyjątków, które mógł zdefiniować w usłudze.
Należy wziąć pod uwagę: SomeException
, który został zdefiniowany i zgłoszony w jednej z implementacji OperationContract
. Gdy jest wyjątek, jego konwertowany do winy stosując następujący kod:
var faultException = new FaultException(error.Message);
MessageFault messageFault = faultException.CreateMessageFault();
fault = Message.CreateMessage(version, messageFault, faultException.Action);
To będzie wysyłać błąd jako ciąg, ale klient musi złapać ogólny wyjątek jak:
try{...}
catch(Exception e){...}
a nie:
try{...}
catch(SomeException e){...}
nie tylko niestandardowe wyjątki takie jak SomeException, ale wyjątki systemowe takie jak InvalidOperationException nie można złapać za pomocą powyższego procesu.
Wszelkie pomysły dotyczące sposobu realizacji tego zachowania?
jaki sposób ogień po HandleError? – KumarHarsh
Czy mogę załączyć procedurę obsługi błędów tylko po stronie klienta? Chcę dołączyć go do wdrożenia 'ClientBase', a raczej do poziomu usługi, czy jest to możliwe? –
Shimmy
Pewnie. Używam metody pomocnika, coś takiego: var factory = new ChannelFactory (binding, endpointAddress); factory.Endpoint.EndpointBehaviors.Add (new PassthroughExceptionHandlingBehavior()); return factory.CreateChannel(); –