【发布时间】:2011-03-29 16:41:57
【问题描述】:
我的 Service 的 OperationContract 的主要参数是一个名为 Preapproval 的类。在 Preapproval 类中,有一些用于 DataMember 属性的公共 getter/setter。我有验证设置器输入的代码,这样我会抛出 ArgumentException,如果说参数为空白或超出域的正确范围。
如果输入无效,我通常会在这里抛出 ArgumentException。由于这是 WCF 情况,我是否必须在此处抛出预定义的 FaultException 而不是 ArgumentException?我知道,在其他地方,我可能会捕获一般异常并将它们作为 FaultExceptions 重新抛出,但此活动将发生在堆栈的更高层,在 WCF 管道自动执行的某些工作中。
例如,当调用者调用我的服务时,序列化程序将反序列化他们的 SOAP,尝试调用我的对象上的设置器,并在实际调用我的操作之前体验到 ArgumentException 的抛出。因此,在 DataContract 类中,简单地立即抛出 FaultExceptions 是一种好的设计实践吗?我真的不想将自定义处理程序连接到通道调度程序。
我知道我可以直接抛出 FaultExceptions,但我真的很想将这类事情限制在服务中。如果无法避免,我也可以在支持类中进行,但我希望尽可能编写典型的代码,与 System.ServiceModel 等没有那么紧密的耦合。
谢谢!
【问题讨论】:
-
使用FaultContractAttribute怎么样?
-
当然,这是我们正在探索的一个选项。我的问题更像是最佳实践。例如,在我们用作服务参数的类中,在它的设置器中,如果我们必须抛出异常,我们是否应该抛出 FaultException,而不是 ArgumentException?通常,我们希望将尽可能少的东西耦合到 WCF 框架,但是看看这些东西是如何用 DataContract 和 DataMember 属性标记的,也许这一点没有实际意义。
-
如果有人读到这篇文章,我决定采用更简单的方法,只将原始类型参数传递给服务,而不是 Preapproval 对象。这样,服务本身可以验证输入并抛出适当的 FaultException。对于这种单一方法的服务,EAB 在这里被证明是矫枉过正。
标签: wcf web-services soap fault faultexception