【问题标题】:Error code or Exception - which is the best practice for an ASP.Net web service?错误代码或异常 - 这是 ASP.Net Web 服务的最佳实践?
【发布时间】:2010-09-09 20:02:14
【问题描述】:

我已阅读此 thread,因为 WCF 具有内置的自定义故障代码和内容。

但是 ASP.Net Web 服务的最佳实践是什么?我是否抛出异常并让客户端处理异常或发送客户端将依赖的错误代码(成功、失败等)来进行处理。

更新:只是为了进一步讨论 SOAP 的情况,假设客户端进行了一个 web svc 调用,它应该是一个通知消息(没有预期的返回值),所以一切都很顺利,svc 不会抛出异常。

现在客户端如何知道通知调用是否由于通信/网络问题或服务器和客户端之间的某些原因而丢失?将此与未引发任何异常进行比较。客户可能会认为它是成功的。但事实并非如此。电话在某处丢失了。

发送“成功”错误代码是否可以确保客户端通话顺利?有没有其他方法可以实现这一点,或者上面的场景是否可能?

【问题讨论】:

    标签: asp.net web-services


    【解决方案1】:

    Jeff Atwood 不久前发布了 an interesting aerticle 关于这个主题的帖子。尽管 .NET 异常被转换为与大多数其他工具包兼容的 SoapFault,但故障中的信息不是很好。因此,文章的结论是 .NET Web 服务不会抛出很好的异常消息,您应该添加额外的信息:

    Private Sub WebServiceExceptionHandler(ByVal ex As Exception)
        Dim ueh As New AspUnhandledExceptionHandler
        ueh.HandleException(ex)
    
        '-- Build the detail element of the SOAP fault.
        Dim doc As New System.Xml.XmlDocument
        Dim node As System.Xml.XmlNode = doc.CreateNode(XmlNodeType.Element, _
            SoapException.DetailElementName.Name, _
            SoapException.DetailElementName.Namespace)
    
        '-- append our error detail string to the SOAP detail element
        Dim details As System.Xml.XmlNode = doc.CreateNode(XmlNodeType.Element, _
            "ExceptionInfo", _
            SoapException.DetailElementName.Namespace)
        details.InnerText = ueh.ExceptionToString(ex)
        node.AppendChild(details)
    
        '-- re-throw the exception so we can package additional info
        Throw New SoapException("Unhandled Exception: " & ex.Message, _
            SoapException.ClientFaultCode, _
            Context.Request.Url.ToString, node)
    End Sub
    

    更多信息为什么soapfaults更好in this question

    【讨论】:

      【解决方案2】:

      取决于您将如何使用 Web 服务 - 即您将使用哪种协议。

      如果是GET或POST,最好返回错误码,因为调用HttpWebRequest(.Net)或其他代码会收到服务器错误,并且必须处理它以提取异常代码。

      如果是 SOAP - 那么抛出自定义异常是完全可以的(您不想返回内部框架异常,因为它们可能会向外部方透露一些堆栈跟踪等)。

      由于 SOAP Web 服务恰好将调用代码视为正常的方法调用,因此相应的调用框架应该能够很好地处理和传播异常,从而使调用代码看起来和行为与其处理一样与内部通话。

      【讨论】:

      • 我真的很想知道为什么这被否决了?这是完全相关的。
      猜你喜欢
      • 1970-01-01
      • 2011-12-24
      • 1970-01-01
      • 2015-07-26
      • 2012-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-07
      相关资源
      最近更新 更多