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