2008-09-19 23 views
3

我发布了一条question关于使用消息与故障异常来传达服务之间的业务规则。WCF - 在您的服务中抛出FaultExceptions的开销

我的印象是它承受了开销,通过线路抛出这个异常,但考虑到它只是一个被序列化和反序列化的消息,事实上它们是一样的。

但是这让我想到抛出一般的异常或更具体地抛出FaultExceptions。

现在我的服务范围内,如果我使用

throw new FaultException 

沟通,如“您的帐户尚未激活”一个简单的业务规则, 什么开销,这是否现在带? 与在.NET中引发常规异常相同吗?或者WCF服务使用故障契约来更有效地处理这些问题。

所以在我的用户为例,这是写我的服务方法

选择最佳/首选方式

public void AuthenticateUser() 
{ 
    throw new FaultException("Your account has not been activated"); 
} 

选项B

public AutheticateDto AutheticateUser() 
{ 
    return new AutheticateDto() { 
      Success = false, 
      Message = "Your account has not been activated"}; 
} 

回答

0

这就像一个正常的异常,并使用相同的包装代码作为正常的异常将编入故障,包括展开堆栈。

像异常一样,在我看来,SOAP故障不应该用于程序流程,而是指示错误。

+0

所以,你是选择B的人? – WebDude 2008-09-19 06:49:23

4

那么......一般来说,你不应该抛出预期条件的异常,或任何你想要定期发生的。它们比普通方法慢得多。例如,如果您希望文件打开失败,请不要将该异常抛出给调用者,传递失败代码或提供“CanOpenFile”方法来执行测试。

确实,消息文本本身并不多,但是抛出并处理了一个真正的异常(可能因为IIS而更昂贵),然后当错误被反序列化时,真正的异常再次抛出客户端。所以,双击。老实说,如果是低通话量,那么你可能不会采取任何明显的打击,但不是一个好主意。谁愿意把业务逻辑在catch块:)

Microsoft : Exceptions And Performance, & Alternatives

Developer Fusion: Performance, with example

相关问题