【问题标题】:WCF faults with SOAPSOAP 的 WCF 错误
【发布时间】:2010-10-23 12:16:58
【问题描述】:

我对如何使用 SOAP 将错误返回给客户端感到困惑。

我有一个 wcf 服务,但我不确定客户端使用的是什么技术,所以我想坚持 SOAP 规范。

据我所知,故障消息似乎是处理此问题的最佳方式。

我可以看到我的服务有许多不同的可能故障:

  • 空\预期数据错误
  • 数据格式错误(即:db 只允许 3 个字符)
  • 数据范围错误“客户已存在”、“无法处理您的请求”类型错误

为每个错误创建一个新对象并像这样抛出是否合适:

FaultException<NullFault>(nf);  
FaultException<InvalidDataFault>(idf);  
FaultException<ArguementFault>(af);  
FaultException<RangeFault>(rf);  

客户端将具有许多属性的大对象传递给几乎每个方法 (即:客户、订单等)。

这是否是处理错误并将其发送回客户端的正确方法?

必须将每个故障添加到方法上方的属性中似乎不合适。

IE:

[OperationContract]  
[FaultContract(typeof(NullFault))]  
[FaultContract(typeof(InvalidDataFault))]  
[FaultContract(typeof(ArguementFault))]  
[FaultContract(typeof(RangeFault))]  
void CreateCustomer(Customer customer);  

另外,GenericFault 呢?您将如何处理业务规则错误?即:客户已经存在,订单项太多,不发货到那个地区,不接受付款方式等?

请让我知道此方法是否正确或是否有其他可接受的解决方案以及您将如何处理“业务规则”情况。

【问题讨论】:

    标签: wcf soap faults


    【解决方案1】:

    一般来说,返回故障是正确的方法,但您也应该问问自己,客户端程序将如何处理您在故障中返回的信息。如果客户只需要知道发生了故障,那么您所需要的只是一个故障。该错误可能包括客户端可以向其用户显示的消息文本。

    如果客户端需要根据是 NullFault 还是 RangeFault 采取不同的操作,那么您就需要单独的故障。但是,如果两者之间没有区别,那么为您和客户端程序节省一些时间和精力,并且只定义一个故障。

    【讨论】:

    • 感谢约翰的回复。我快速跟进的问题:如果您要采用单一故障方式,您认为创建故障类型的枚举属性是否是个好主意(即:NullReference、Range、InvalidData、BusinessRule、Other)?你知道这个枚举是否也可以在肥皂消息中传递吗?谢谢,史蒂文
    • 您可以返回这样的枚举,但请记住,您的客户必须查看该信息并对其进行处理。如果他们不打算对您发送给他们的信息进行程序化处理,请不要发送。
    • 是的,我同意。我想我所能做的就是告诉他们并希望他们相应地使用它。谢谢,史蒂文
    猜你喜欢
    • 2023-03-21
    • 1970-01-01
    • 2011-12-20
    • 1970-01-01
    • 2023-03-20
    • 2011-09-09
    • 2012-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多