我为我的wcf应用程序构建了一个全局异常处理。我有一个实现'IErrorHandler'的类并处理异常。我可以使用'IServiceBehavior'属性注册ErrorHandler。 (所以我不需要触及每个功能)
我使用'FaultException'类来包装我的异常对象。
Dim sysEx As SystemException = 'Do Convert
Dim fex As New FaultException(Of SystemException)(sysEx, sysEx.Message)
Dim faultMessage As MessageFault = fex.CreateMessageFault
fault = System.ServiceModel.Channels.Message.CreateMessage(version, faultMessage, fex.Action)
现在我可以在客户端检索错误消息。但不幸的是,我无法检索原始异常类型或原始堆栈跟踪。
是否有一个简单的选项可以解决问题,而无需为我的服务中的每个功能添加“FaultContract”?
谢谢
答案 0 :(得分:1)
使用FaultContracts
并使用自定义FaultExceptions
类型投放Fault
是{3}}在WCF中处理异常。如果需要在客户端检索堆栈跟踪,可以在WCF行为配置中将the recommended way设置为true。
答案 1 :(得分:1)
自定义故障合同:
[DataContract]
public class UncaughtErrorFault
{
[DataMember]
public string ExecptionType { get; set; }
[DataMember]
public string Message { get; set; }
[DataMember]
public string StackTrace { get; set; }
}
IErrorHandler方法覆盖:
public void ProvideFault(Exception error,
MessageVersion version,
ref Message fault)
{
var fe = new FaultException<UncaughtErrorFault>(
new UncaughtErrorFault
{
ExecptionType = error.GetType().Name,
Message = error.Message,
StackTrace = error.StackTrace
},
error.Message,
FaultCode.CreateReceiverFaultCode(
new FaultCode(error.GetType().Name)));
var mf = fe.CreateMessageFault();
fault = Message.CreateMessage(version, mf, fe.Action);
}
答案 2 :(得分:0)
在IErrorHandler.ProvideFault中,您将在第一个参数中获得异常。您可以将其包装在自定义FaultMessage中。
IErrorHandler.ProvideFault(异常错误,MessageVersion ver,ref Message fault)
请参阅IErrorHandler Interface。此页面提供了有关如何执行此异常包装的示例。