我已经为我的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”?
谢谢
发布于 2011-07-12 23:04:30
Steve和Saravanan都是正确的。下面是如何创建自定义故障类型以及如何使用它:
自定义错误契约:
[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);
}发布于 2011-07-12 22:50:41
使用FaultContracts和抛出带有自定义Fault类型的FaultExceptions是在Fault中处理异常的the recommended way。如果您需要在客户端检索堆栈跟踪,可以在您的WCF behaviour配置中将includeExceptionDetailInFaults设置为真。
发布于 2011-07-12 22:56:40
在IErrorHandler.ProvideFault中,您将在第一个参数中获得异常。您可以将其封装在您的自定义FaultMessage中。
IErrorHandler.ProvideFault(异常错误、MessageVersion版本、ref消息故障)
请参考IErrorHandler Interface。此页提供了一个有关如何执行此异常包装的示例。
https://stackoverflow.com/questions/6666017
复制相似问题