WCF – 故障/exception与消息

我们目前正在辩论是否最好在WCF通道上抛出错误,而不是传递一个消息来指示服务的状态或响应。

故障来自WCF的内置支持,您可以使用内置的error handling程序并作出相应的反应。 但是,这会带来开销,因为在.NET中抛出exception可能会非常昂贵。

消息可以包含必要的信息,以确定您的服务调用发生了什么,而不会引发exception的开销。 然而,它需要几行重复的代码来分析消息并确定其内容之后的动作。

我们试图创build一个可以在我们的服务中使用的通用消息对象,这就是我们想到的:

public class ReturnItemDTO<T> { [DataMember] public bool Success { get; set; } [DataMember] public string ErrorMessage { get; set; } [DataMember] public T Item { get; set; } } 

如果我所有的服务电话都返回这个项目,我可以持续检查“成功”属性,以确定是否一切顺利。 然后在事件中出现错误消息string,表示出错了,如果需要的话,包含Dto的通用项目。

exception信息必须logging到中央日志logging服务,而不是从服务传回。

思考? 注释? 想法? build议?

在我的问题上进一步澄清

我遇到的问题是交stream业务规则。

就像,如果有人login,他们的帐户被locking,我该如何沟通? 他们的login显然失败,但由于“帐户locking”的原因而失败。

我也是:

A)使用布尔值,抛出带locking消息帐户的Fault

B)返回AuthenticatedDTO与相关信息

3 Solutions collect form web for “WCF – 故障/exception与消息”

然而这会带来开销,因为在.NET中抛出exception可能会相当昂贵。

你正在序列化和反序列化对象到XML,并通过一个缓慢的networking发送它们。抛出一个exception的开销相比,是可以忽略的。

我通常坚持抛出exception,因为他们清楚地沟通出了问题, 所有的 webservice工具包都有很好的处理方式。

在你的示例中,我会抛出一个UnauthorizedAccessException与消息“帐户locking”。

澄清:默认情况下,.NET wcf服务将exception转换为FaultContracts,但您可以更改此行为。 MSDN:指定和处理合同和服务中的错误

如果您想调用其他方法来调用这个服务,那么这个方法可能会帮助您理清这些问题。 想象一下,如果你调用的每一个方法都返回一个状态,那么由你来决定是否为真。 这将是相当繁琐的。

 result = CallMethod(); if (!result.Success) handleError(); result = CallAnotherMethod(); if (!result.Success) handleError(); result = NotAgain(); if (!result.Success) handleError(); 

这是一个结构化的error handling系统的优点之一,就是你可以将你的实际逻辑从你的error handling中分离出来。 你不需要继续检查,如果没有抛出exception,你就知道这是成功的。

 try { CallMethod(); CallAnotherMethod(); NotAgain(); } catch (Exception e) { handleError(); } 

与此同时,通过返回结果,您将更多的责任放在客户端。 您可能会知道检查结果对象中的错误,但是John Doe进来并刚开始打电话给您的服务,忘记了因为不抛出exception而导致任何错误。 这是另一个例外的强大之处,就是当出现问题时,他们给我们一个好的巴掌,需要照顾。

我会认真考虑使用FaultContract和FaultException对象来解决这个问题。 这将允许您将有意义的错误消息传递回客户端,但只有在出现故障时才会传递给客户端。

不幸的是,我目前正在参加一个培训课程,所以不能写出完整的答案,但幸运的是,我正在学习WCF应用程序中的exceptionpipe理。 今晚我会回复更多的信息。 (对不起,这是一个微弱的答案)

  • 使用Visual Studio 2013在C#中创build一个asmx Web服务
  • WCF错误“对象图中可以序列化或反序列化的项的最大数目是'65536'”
  • WCF停止响应约10左右的电话(节stream)
  • 如何获得一个wcf应用程序的工作path?
  • 我可以使用UriTemplate将非string传递给WCF RESTful服务吗?
  • WCF:System.Net.SocketException - 通常只允许使用每个套接字地址(协议/networking地址/端口)
  • 无法添加服务引用 - locking/只读
  • DataContractJsonSerializer和Enums
  • 现有连接被远程主机强制closures - WCF
  • 如何以编程方式修改WCF app.config端点地址设置?
  • 为什么DateTime.MinValue不能在UTC之前的时区中序列化?