【问题标题】:Throwing exceptions from .NET web service从 .NET Web 服务引发异常
【发布时间】:2011-02-09 09:32:07
【问题描述】:

我有一组使用[WebMethod] 属性生成的网络服务。如果未正确指定其参数(并且无法使用合理的默认值),从这种方法中抛出 ArgumentException 是否被认为是“良好做法”?如果是这样,是否应该捕获并重新抛出此异常以便将其记录在服务器和客户端上?

【问题讨论】:

  • AFAIK,应该不需要重新抛出,因为您可以将故障配置为通过线路发送。从表面上看,我会说是的,抛出,但这取决于 - 例如,您的框架可能被构造为使用具有 ResultsErrors 集合的复合类型。

标签: c# web-services exception-handling webmethod


【解决方案1】:

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

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

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

如果你搬到 WCF,你可以看看FaultContracts

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

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

当验证调用参数时,应生成上述错误,因为客户端调用您的服务时参数错误。

可能相关 - 一旦请求通过验证,对于您自己的内部系统状态断言,您还可以使用 Code Contracts 来检测内部错误(或者可能,缺少应该早先发生的验证)。但是,这些不会传播给客户端。

【讨论】:

    【解决方案2】:

    使用异常与自定义错误代码始终是一个艰难的决定。您应该估计,这种情况有多“特殊”,以及您打算如何处理消费者方面的错误。使用异常通常是意外情况(例如缺少重要参数)和自定义错误代码来处理类似业务的错误。

    更新:这当然只适用于创建新服务的情况。如果您修改现有的,您必须知道现有客户如何使用它以及他们如何期望错误代码。

    【讨论】:

      【解决方案3】:

      Here 是一篇关于 Web 服务异常的好文章

      【讨论】:

        猜你喜欢
        • 2017-03-03
        • 2013-09-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-25
        • 1970-01-01
        相关资源
        最近更新 更多