私が使用して私のWCFサービスで例外処理を集中しようとしていますErrorHandler
(System.ServiceModel.Dispatcher.IErrorHandler
)WCFとカスタムフォルト?
これは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");
}
ValidationHandler
がSystem.Exception
ですがdatacontract
属性を持っていません。 ValidationHandler
はすべてのデータが格納されているMainValidation
のリストを含み、このクラスはdatacontract
属性で修飾されています。
ErrorHandler.HandleException
はExceptionContainer
(datacontract
)MainValidation
(datacontract
)のリストを含むを含むカスタム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" />