WCF 异常处理策略

Posted

技术标签:

【中文标题】WCF 异常处理策略【英文标题】:WCF Exception Handling Strategies 【发布时间】:2011-01-23 16:59:45 【问题描述】:

我们正在 WCF 中开发一个代理,它将作为一些运行我们自定义客户端应用程序的手持设备的通信方式。我很好奇人们使用什么错误处理策略,因为我不想在 try/catch 中包装每个代理调用。

当我开发 ASP .NET 时,我没有捕捉到大多数异常,我利用 Global asax 中的 Application_Error,然后它可以记录异常、发送电子邮件并将用户重定向到自定义错误登录页面。我在 WCF 中寻找的内容与此类似,只是它允许我从中心位置将一般故障原因传递给客户端。

基本上,我很好奇人们如何在 WCF 应用程序中集中处理异常。

谢谢

【问题讨论】:

重要问题:您是否使用自定义故障/故障合同? 【参考方案1】:

您可能会发现IErrorHandler 接口在这里很有用。我们一直在使用它来完成您提到的几乎所有事情 - 集中式异常日志记录并提供通用故障原因,而无需在代码中乱扔大量 try/catch 来尝试在本地处理问题。

【讨论】:

是的,这实际上正是我一直在寻找的,我花了一些功夫来实现它(见下文),但它 100% 是我需要的 任何简单的例子都值得赞赏【参考方案2】:

这就是我所做的。我们的应用程序中有一些自定义异常,例如 BusinessRuleException 和 ProcessException,WCF 支持 FaultException 和 FaultException<T>

一般的做法似乎是,在出现一般错误或您不想准确显示发生的错误的情况下,您总是向客户端抛出 FaultException。在其他情况下,您可以传递FaultException<T>,其中 T 是一个包含特定异常信息的类。

我在应用程序中创建了这个 Violations 概念,这基本上意味着任何自定义异常都有一个包含相应 Violation 实例的属性。然后将此实例传递给客户端,使客户端能够识别何时发生了可恢复的错误。

这解决了部分问题,但我仍然想要一个通用的捕获所有可以让我集中记录的内容。我通过使用 IErrorHandle 接口并将我自己的自定义错误处理程序添加到 WCF 发现了这一点。代码如下:

public class ServiceHostGeneralErrorHandler : IErrorHandler

    public void ProvideFault(Exception ex, MessageVersion version, ref Message fault)
    
        if (ex is FaultException)
            return;

        // a general message to the client
        var faultException = new FaultException("A General Error Occured");
        MessageFault messageFault = faultException.CreateMessageFault();
        fault = Message.CreateMessage(version, messageFault, null);
    

    public bool HandleError(Exception ex)
    
        // log the exception

        // mark as handled
        return true;
    

使用此方法,我可以将异常从任何内容转换为可以轻松显示在客户端上的内容,同时记录真正的异常以供 IT 人员查看。到目前为止,这种方法运行良好,并遵循与应用程序中其他模块相同的结构。

【讨论】:

如果我理解正确的话,我们都有相同的目标。以下是我的处理方法。 ***.com/questions/6356669/…你怎么看?【参考方案3】:

我们使用异常处理应用程序块并屏蔽客户端的大多数故障以避免泄露敏感信息,这个article 可能是您的一个很好的起点,就像“最佳实践”一样 - 您应该使用适合您的域的内容。

【讨论】:

以上是关于WCF 异常处理策略的主要内容,如果未能解决你的问题,请参考以下文章

WCF 异常处理

WCF异常处理

WCF:OneWay OperationContract 上的异常处理

WCF系列教程之WCF客户端异常处理

WCF 异步调用 - 事件处理程序中的异常

如何强制 WCF 线程中未处理的异常使进程崩溃?