从.NET Web服务中抛出异常

Chr*_*per 5 c# web-services exception-handling webmethod

我有一组使用该[WebMethod]属性生成的Web服务.ArgumentException如果没有正确指定它的参数(并且不能使用合理的默认值),那么从这样的方法抛出是否被认为是"好习惯" ?如果是这样,是否应该捕获并重新抛出此异常,以便在服务器和客户端上记录它?

Stu*_*tLC 5

不,从Web服务抛出异常并不是一种好的做法,因为ArgumentException跨平台不支持.NET异常(例如)(想想Java客户端需要如何响应).

在Web服务中指示异常的标准机制是Soap Fault.

使用.asmx,抛出SOAPException会为您生成错误.

如果您转到WCF,您可以查看FaultContracts.

为了改进.Net客户端和.Net服务器之间远程异常的调试,您可以通过在配置中使用includeExceptionDetailInFaults来欺骗并发送异常.异常本身必须是可序列化的才能使其正常工作.但是,您需要在系统投入生产之前将其关闭.

顺便说一句,你经常会发现,如果调用者的SOAP请求调用形成得太差(例如,如果你的参数包含无法反序列化的实体),你WebMethod根本就不会被调用 - 调用者只会收到错误(通常很神秘).

当验证调用参数时,应该生成上述针对客户端调用服务的错误参数引发的错误.

可能相关 - 一旦请求通过验证,对于您自己的内部系统状态断言,您还可以使用代码约定来检测内部错误(或者可能缺少应该在之前发生的验证).然而,这些不会传播给客户.