我试图通过使用集中的异常处理在我的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
将ValidationHandler
翻译为FaultException<MyCustomFault>
是含MainValidation
(datacontract
)列表中包含ExceptionContainer
(datacontract
)的自定义FaultException
。
如果我删除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" />