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");
}
ValidationHandler
是 System.Exception
但没有 datacontract
属性。 ValidationHandler
包含一个 MainValidation
的列表,其中存储了所有数据,这个 class 用 datacontract
属性装饰。
ErrorHandler.HandleException
会将 ValidationHandler
转换为 FaultException<MyCustomFault>
,这是一个包含 ExceptionContainer
(datacontract
) 的自定义 FaultException
列表MainValidation
(datacontract
)。
如果我删除 IErrorHandler
并直接从服务方法中抛出 ErrorHandler.HandleExceptio
n,一切正常。 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
我正在尝试使用 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
的列表,其中存储了所有数据,这个 class 用 datacontract
属性装饰。
ErrorHandler.HandleException
会将 ValidationHandler
转换为 FaultException<MyCustomFault>
,这是一个包含 ExceptionContainer
(datacontract
) 的自定义 FaultException
列表MainValidation
(datacontract
)。
如果我删除 IErrorHandler
并直接从服务方法中抛出 ErrorHandler.HandleExceptio
n,一切正常。 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