Exception handling WCF异常处理策略

Exception handling WCF异常处理策略,exception-handling,error-handling,wcf,Exception Handling,Error Handling,Wcf,我们正在WCF中开发一个代理,它将作为一些运行自定义客户端应用程序的手持设备的通信手段。我很好奇人们使用什么错误处理策略,因为我不希望在try/catch中包装每个代理调用 当我开发ASP.NET时,我不会捕获大多数异常,我利用全局asax中的应用程序错误,它可以记录异常,发送电子邮件,并将用户重定向到自定义错误登录页。我在WCF中寻找的与此类似,只是它允许我从一个中心位置向客户端传递一个一般的faultreason 基本上,我很好奇人们是如何在WCF应用程序中集中处理异常的 感谢我们使用异常处

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

当我开发ASP.NET时,我不会捕获大多数异常,我利用全局asax中的应用程序错误,它可以记录异常,发送电子邮件,并将用户重定向到自定义错误登录页。我在WCF中寻找的与此类似,只是它允许我从一个中心位置向客户端传递一个一般的faultreason

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


感谢

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

您可能会发现该接口在这里很有用。我们一直在使用它来完成您提到的大部分工作—集中异常日志记录和提供一般故障原因,而不必在代码中添加大量的try/catch来尝试并在本地处理问题。

下面是我所做的。我们的应用程序中有一些自定义异常,如BusinessRuleException和ProcessException,WCF同时支持FaultException和
FaultException

一般的做法似乎是,在发生一般性错误或不希望确切显示发生了什么的错误时,总是向客户机抛出FaultException。在其他情况下,您可以传递
FaultException
,其中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人员查看。到目前为止,这种方法工作得很好,并且与应用程序中的其他模块采用相同的结构。

重要问题:您是否使用自定义故障/故障契约?是的,这正是我所寻找的,需要一些工作才能使其运行(见下文)但是我需要的是100%如果我理解正确的话,任何简单的例子都是值得欣赏的,我们都有相同的目标。下面是我如何处理它的。你觉得那样怎么样?