2011-07-12 66 views
2

我为我的wcf应用程序构建了一个全局异常处理。我有一个实现“IErrorHandler”并处理异常的类。我可以使用'IServiceBehavior'属性注册ErrorHandler。 (所以我不需要触及每个函数)WCF全局异常处理

我使用类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”?

谢谢

回答

1

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); 
} 
+0

也许我表达自己错了。我怎样才能将“UncaughtErrorFault”类“发布”到客户端?该类型不会被添加到自动生成的“服务引用”(当然)。所以WCF将故障转换回正常的System.Exception,而不是在“UncaughtErrorFault”对象中。我该如何解决这个问题? – Mimefilt

+0

要发布自定义错误,请查看此[MSDN文章](http://msdn.microsoft.com/zh-cn/library/ms733841.aspx)。它显示了如何使用指定您的自定义类型的FaultContract属性标记服务OperationContract方法。但是,您的意志需要标记服务的每个操作方法以使服务引用包含必要的反序列化代码。这就是我在@SteveWilkes评论中提到的 –

1

使用FaultContracts和投掷FaultExceptions定制Fault类型是WCF移交例外the recommended way。如果您需要在客户端检索堆栈跟踪,则可以在WCF行为配置中将includeExceptionDetailInFaults设置为true。

+0

不幸的是,服务可以抛出正常的.NET异常和有一些“封闭源代码”部分也会抛出正常的.NET异常。所以我需要一种通用且易于处理的方式将.NET异常转换为SOAP错误。为此我写了上面的代码。不幸的是,我不知道如何创建一个可以包含更多属性的自定义错误,而无需为每个函数添加FaultContract。 – Mimefilt

+0

除非您希望WCF抛出该自定义错误,否则不需要为操作方法添加FaultContract属性。你总是可以捕获标准的WCF FaultException,因为你的自定义错误是“嵌入”它的。您可以为FaultException类型编写扩展方法来提取您提供的任何自定义信息。 –

0

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

IErrorHandler.ProvideFault(异常错误,MessageVersion版本,参考消息故障)

请参考IErrorHandler Interface。这个页面提供了一个关于如何做这个异常包装的例子。