Exception handling WCF异常处理策略
我们正在WCF中开发一个代理,它将作为一些运行自定义客户端应用程序的手持设备的通信手段。我很好奇人们使用什么错误处理策略,因为我不希望在try/catch中包装每个代理调用 当我开发ASP.NET时,我不会捕获大多数异常,我利用全局asax中的应用程序错误,它可以记录异常,发送电子邮件,并将用户重定向到自定义错误登录页。我在WCF中寻找的与此类似,只是它允许我从一个中心位置向客户端传递一个一般的faultreason 基本上,我很好奇人们是如何在WCF应用程序中集中处理异常的Exception handling WCF异常处理策略,exception-handling,error-handling,wcf,Exception Handling,Error Handling,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%如果我理解正确的话,任何简单的例子都是值得欣赏的,我们都有相同的目标。下面是我如何处理它的。你觉得那样怎么样?