WCF全局异常处理

时间:2011-07-12 14:41:07

标签: .net vb.net visual-studio wcf

我为我的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”?

谢谢

3 个答案:

答案 0 :(得分:1)

使用FaultContracts并使用自定义FaultExceptions类型投放Fault是{3}}在WCF中处理异常。如果需要在客户端检索堆栈跟踪,可以在WCF行为配置中将the recommended way设置为true。

答案 1 :(得分:1)

史蒂夫& 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);
}

答案 2 :(得分:0)

在IErrorHandler.ProvideFault中,您将在第一个参数中获得异常。您可以将其包装在自定义FaultMessage中。

IErrorHandler.ProvideFault(异常错误,MessageVersion ver,ref Message fault)

请参阅IErrorHandler Interface。此页面提供了有关如何执行此异常包装的示例。