2016-05-31 5 views
0

私が使用して私のWCFサービスで例外処理を集中しようとしていますErrorHandlerSystem.ServiceModel.Dispatcher.IErrorHandlerWCFとカスタムフォルト?

これはProvideFaultがどのように見えるかです:

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"); 
    } 

ValidationHandlerSystem.Exceptionですがdatacontract属性を持っていません。 ValidationHandlerはすべてのデータが格納されているMainValidationのリストを含み、このクラスはdatacontract属性で修飾されています。

ErrorHandler.HandleExceptionExceptionContainerdatacontractMainValidationdatacontract)のリストを含むを含むカスタムFaultExceptionあるFaultException<MyCustomFault>ValidationHandlerを変換します。

IErrorHandlerを削除して、サービスメソッドから直接ErrorHandler.HandleExceptioを直接スローすると、すべて正常に動作します。 CustomFaultはクライアントに到着し、検証が処理されます。

しかし、IErrorHandlerを使用している間、クライアントに到着した障害はFaultException<MyCustomFault>にキャストできませんか? Message.CreateMessageを実行しているときにデータが失われたようですか?

編集1:CreateMessageFaultから生成されたMessageFaultに詳細があることがわかります。これをMyCustomFaultにキャストすると、内容を正しく読み取ることができます。問題はクライアントに到着するときにこれが含まれない理由です。

編集2:例外がクライアントに到着すると、FaultExceptionにキャストしようとしますが、これはnullを返します。 MyCustomFaultは途中で失われているようですか?

編集3:私は設定に行動上の次のセットを持っている:

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

答えて