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" />