2016-05-31 5 views
0

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

Répondre