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与相关信息
然而这会带来开销,因为在.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理。 今晚我会回复更多的信息。 (对不起,这是一个微弱的答案)