我有一组使用[WebMethod]
属性生成的Web服务。如果没有正确指定参数(并且没有合理的默认值可以使用),那么从这样的方法中抛出ArgumentException
会被认为是“好习惯”吗?如果是这样,是否应该捕获并重新抛出此异常,以便在服务器和客户端上记录它?
答案 0 :(得分:5)
不,从Web服务抛出异常并不是一种好的做法,因为跨平台不支持.NET异常(如ArgumentException
)(想想Java客户端需要如何响应)。
在Web服务中指示异常的标准机制是Soap Fault。
使用.asmx
,抛出SOAPException会为您带来错误。
如果您转到WCF,可以查看FaultContracts。
为了改进.Net客户端和.Net服务器之间远程异常的调试,您可以在配置中使用includeExceptionDetailInFaults欺骗并发送异常。异常本身必须是可序列化的才能使其正常工作。但是,您需要在系统投入生产之前将其关闭。
顺便说一句,如果调用者的SOAP请求调用形成得太差(例如,如果你的参数包含无法反序列化的实体),你将经常发现你的WebMethod
根本就不会被调用 - 来电者只会收到错误(通常非常神秘)。
当验证调用参数时,应该生成上述由客户端调用服务的错误参数引发的错误。
可能相关 - 一旦请求通过验证,对于您自己的内部系统状态断言,您还可以使用Code Contracts来检测内部错误(或者可能缺少应该在之前发生的验证)。然而,这些不会传播给客户。
答案 1 :(得分:3)
使用例外与自定义错误代码始终是一个艰难的决定。您应该估计,案例的“特殊”程度如何,以及您计划如何处理消费者方面的错误。使用异常通常是意外情况(如缺少一个重要参数)和自定义错误代码来处理类似业务的错误。
更新:如果您要创建新服务,这当然只适用。如果修改现有客户端,则必须知道现有客户端如何使用它以及它们如何期望错误代码。
答案 2 :(得分:3)
Here是关于网络服务例外的好文章