2016-05-31 16 views
0

Ich versuche, die Ausnahmebehandlung in meinem WCF-Dienst zentralisieren durch eine mit ErrorHandler (System.ServiceModel.Dispatcher.IErrorHandler)WCF und benutzerdefinierte Fehler?

Dies ist, wie die ProvideFault wie folgt aussehen:

public void ProvideFault(Exception error, MessageVersion version, ref Message fault) 
    { 

     if (error is ValidationHandler) 
     { 
      var val = error as ValidationHandler; 
      var val2 = ErrorHandler.HandleException(val); 
      fault = Message.CreateMessage(version, val2.CreateMessageFault(), "http://ns"); 
     } 
     else if (error is FaultException) 
      fault = Message.CreateMessage(version, (error as FaultException).CreateMessageFault(), "http://ns"); 
     else 
      fault = Message.CreateMessage(version, ErrorHandler.HandleException(error).CreateMessageFault(), "http://ns"); 
    } 

Die ValidationHandler ist ein System.Exception haben aber nicht datacontract Attribut . ValidationHandler enthält eine Liste von MainValidation, in der alle Daten gespeichert sind und diese Klasse mit datacontract Attribut verziert ist.

ErrorHandler.HandleException die ValidationHandler zu einem FaultException<MyCustomFault> übersetzen, die eine benutzerdefinierte ist FaultException enthält ExceptionContainer (datacontract) enthält die Liste der MainValidation (datacontract).

Wenn ich die IErrorHandler entferne und nur die ErrorHandler.HandleExceptio n direkt von der Service-Methode löst, funktioniert alles gut. Der CustomFault, der beim Client eintrifft, und die Validierung können bearbeitet werden.

Aber während der Verwendung von IErrorHandler kann der Fehler, der beim Client ankommt, nicht an FaultException<MyCustomFault> gesendet werden? Es scheint, dass Daten verloren gehen, wenn Message.CreateMessage ausgeführt wird?

Edit 1: Ich kann sehen, dass die MessageFault, die von CreateMessageFault generiert werden, ein Detail haben, und wenn ich dies in MyCustomFault umwandeln kann ich den Inhalt richtig lesen. Die Frage ist, warum dies nicht bei der Ankunft beim Kunden enthalten ist?

Edit 2: Wenn die Ausnahme beim Client ankommt, versuche ich es auf FaultException zu werfen, aber das gibt null zurück. Also scheint MyCustomFault auf dem Weg verloren zu sein?

Bearbeiten 3: Ich habe in der Config auf das Verhalten folgende Einstellungen:

<serviceDebug includeExceptionDetailInFaults="true" /> 
<serviceMetadata httpGetEnabled="true" /> 

Antwort