WCF 和自定义故障?

WCF and custom fault?

我正在尝试使用 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");
    }

ValidationHandlerSystem.Exception 但没有 datacontract 属性。 ValidationHandler 包含一个 MainValidation 的列表,其中存储了所有数据,这个 class 用 datacontract 属性装饰。

ErrorHandler.HandleException 会将 ValidationHandler 转换为 FaultException<MyCustomFault>,这是一个包含 ExceptionContainer(datacontract) 的自定义 FaultException 列表MainValidationdatacontract)。

如果我删除 IErrorHandler 并直接从服务方法中抛出 ErrorHandler.HandleException,一切正常。 CustomFault 到达客户端并可以处理验证。

但是在使用 IErrorHandler 时,无法将到达客户端的故障转换为 FaultException<MyCustomFault>? 运行 Message.CreateMessage?

时似乎数据丢失了

编辑 1:我可以看到从 CreateMessageFault 生成的 MessageFault 确实有一个详细信息,如果我将其转换为我的 MyCustomFault,我可以正确读取内容。问题是为什么到客户的时候不包括这个?

编辑 2:当异常到达客户端时,我尝试将其转换为 FaultException,但此 returns 为空。所以 MyCustomFault 似乎在途中丢失了?

编辑 3:我对配置中的行为进行了以下设置:

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

我不得不更改“http://ns" to null(MyCustomFault.Action). Found it here : WCF: provide generic FaultException in IErrorHandler