WCF故障和SOAP

3
我对如何使用SOAP向客户端返回错误感到困惑。
我有一个WCF服务,但我不确定客户端使用的是什么技术,所以我想遵循SOAP规范。
据我所知,故障消息似乎是处理此问题的最佳方法。
我可以看到我的服务有许多可能的故障:
- 空值\预期数据错误 - 数据格式错误(即:数据库只允许3个字符) - 数据范围错误“客户已存在”,“无法处理您的请求”类型的错误
为每个故障创建一个新对象并抛出是否合适?
FaultException<NullFault>(nf);  
FaultException<InvalidDataFault>(idf);  
FaultException<ArguementFault>(af);  
FaultException<RangeFault>(rf);  

客户端向几乎每个方法(如客户、订单等)传递具有许多属性的大型对象。
这是否是处理错误并将其发送回客户端的正确方式?
似乎将每个故障添加到方法上面的属性中不太合适。
例如:
[OperationContract]  
[FaultContract(typeof(NullFault))]  
[FaultContract(typeof(InvalidDataFault))]  
[FaultContract(typeof(ArguementFault))]  
[FaultContract(typeof(RangeFault))]  
void CreateCustomer(Customer customer);  

此外,如果出现GenericFault,您该如何处理业务规则错误?例如:客户已存在、行项目过多、不要向该地区发货、不接受付款方式等等。
请告诉我这种方法是否正确,或者是否有其他可接受的解决方案以及您如何处理“业务规则”情况。
1个回答

2

一般而言,返回一个故障是正确的做法,但您还应该问问自己客户端程序将如何处理您返回的故障信息。如果客户端只需知道发生了故障,那么你只需要一个故障即可。这个故障可能包含消息文本,客户端可以显示给其用户。

如果客户端需要根据它是NullFault还是RangeFault来采取不同的行动,那么这就是你需要单独定义故障的时候。但如果两者之间没有区别,那么请节省自己和客户端程序的时间和精力,仅定义一个故障即可。


谢谢John的回复。 我有一个快速的追问: 如果您选择单一故障方式,那么您认为创建一个枚举属性来表示故障类型(例如:NullReference、Range、InvalidData、BusinessRule、Other),这是否是一个好主意?另外,您知道这个枚举也能够在SOAP消息中传递吗?谢谢, Steven - stevenrosscampbell
你可以返回这样的枚举,但请记住,你的客户端需要查看该信息并对其进行处理。如果他们不会以编程方式处理所发送的信息,则不要发送它。 - John Saunders
是的,我同意。我想我能做的就是告诉他们这件事,并希望他们能相应地使用它。谢谢, 史蒂文 - stevenrosscampbell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接