我正在尝试使用ErrorHandler
(System.ServiceModel.Dispatcher.IErrorHandler
)
这就是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
会将ValidationHandler
翻译为FaultException<MyCustomFault>
,该FaultException
是包含ExceptionContainer
(datacontract
)的自定义MainValidation
,其中包含{ {1}}(datacontract
)。
如果我删除IErrorHandler
并从服务方法直接抛出ErrorHandler.HandleExceptio
n一切正常。到达客户端的CustomFault可以处理验证。
但是在使用IErrorHandler
时,到达客户端的错误无法转换为FaultException<MyCustomFault>
?运行Message.CreateMessage
?
编辑1:我可以看到从CreateMessageFault生成的MessageFault确实有详细信息,如果我将其转换为MyCustomFault,我可以正确读取内容。问题是为什么到达客户时不包括这个?
编辑2:当异常到达客户端时,我尝试将其强制转换为FaultException但返回null。那么MyCustomFault似乎在路上丢失了?
编辑3:我对配置中的行为进行了以下设置:
<serviceDebug includeExceptionDetailInFaults="true" />
<serviceMetadata httpGetEnabled="true" />
答案 0 :(得分:0)
我要将“http://ns”更改为null(MyCustomFault.Action)。在这里找到它:WCF: provide generic FaultException in IErrorHandler