Je suis en train de centraliser la gestion des exceptions dans mon service WCF en utilisant un ErrorHandler
(System.ServiceModel.Dispatcher.IErrorHandler
)WCF et erreur personnalisée?
Voici comment regarder la ProvideFault comme:
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");
}
Le ValidationHandler
est un System.Exception
mais ne pas datacontract
attribut . ValidationHandler
contient une liste de MainValidation
où toutes les données sont stockées et cette classe est décorée avec l'attribut datacontract
.
ErrorHandler.HandleException
se traduira par la ValidationHandler
à un FaultException<MyCustomFault>
qui est une coutume FaultException
contenant ExceptionContainer
(datacontract
) contenant la liste des MainValidation
(datacontract
).
Si je supprime le IErrorHandler
et jette juste le ErrorHandler.HandleExceptio
n directement à partir de la méthode de service tout fonctionne correctement. La CustomFault arrivant sur le client et la validation peuvent être traitées.
Mais lors de l'utilisation IErrorHandler
la faute qui arrivent au client ne peut pas être castée à FaultException<MyCustomFault>
? Il semble que les données sont perdues lors de l'exécution du Message.CreateMessage
?
Édition 1: Je peux voir que les MessageFault qui sont générés à partir de CreateMessageFault ont un détail et si je le caste à mon MyCustomFault je peux lire le contenu correctement. La question est pourquoi ce n'est pas inclus en arrivant chez le client?
Édition 2: Lorsque l'exception arrive sur le client, j'essaie de la convertir en FaultException mais cela retourne null. Donc, le MyCustomFault semble être perdu en chemin?
Edit 3: Je disposer des éléments suivants fixé sur le comportement dans la configuration:
<serviceDebug includeExceptionDetailInFaults="true" />
<serviceMetadata httpGetEnabled="true" />