WCF异常处理策略

24
我们正在开发一个WCF代理,将作为通信手段为运行我们自定义客户端应用程序的一些手持设备提供服务。我很好奇人们使用的错误处理策略,因为我不想在每个代理调用中都使用try/catch。
当我开发ASP .NET时,我不会捕获大部分异常,我利用Global.asax中的Application_Error来记录异常、发送电子邮件并将用户重定向到自定义错误着陆页。在WCF中,我想要类似于此的功能,但它将允许我从一个中心位置传递一个通用故障原因给客户端。
基本上,我想知道人们如何将异常处理集中化在WCF应用程序中。
谢谢

重要问题:您是否使用自定义故障/故障契约? - Aaronaught
3个回答

22

在这里,您可能会发现IErrorHandler接口非常有用。我们一直在使用它来进行集中式异常日志记录,并提供通用的故障原因,而不必在代码中添加大量的try/catch来尝试本地处理问题。


1
是的,这确实是我正在寻找的东西,需要一些工作才能让它运行(请参见下文),但它完全符合我的需求。 - xximjasonxx
任何简单的例子都会很有帮助 - sll

15
所以这是我做的事情。我们的应用程序中有一些自定义异常,例如BusinessRuleException和ProcessException,WCF支持FaultException和FaultException<T>
通常的做法似乎是,在出现一般错误或不想准确显示发生了什么错误的情况下,始终向客户端抛出FaultException。在其他情况下,您可以传递FaultException<T>,其中T是包含有关特定异常信息的类。
我在应用程序中创建了违规概念,这基本上意味着任何自定义异常都有一个包含相应违规实例的属性。然后将此实例传递给客户端,使客户端能够识别何时发生可恢复错误。
这解决了部分问题,但我仍然希望有一个通用的捕获所有,使我能够集中日志记录。我通过使用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工作人员查看。到目前为止,这种方法效果很好,并且与应用程序中的其他模块遵循相同的结构。

如果我理解正确,我们都有相同的目标。这是我的解决方案。http://stackoverflow.com/questions/6356669/wcf-exception-throwing-and-handling-the-oop-way 你认为这种方法怎么样? - user20358

2
我们使用异常处理应用程序块并屏蔽大部分故障,以避免披露敏感信息。此文章可能是您的良好起点,至于“最佳实践” - 您应该使用适合您领域的内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接