代码之家  ›  专栏  ›  技术社区  ›  Vin

错误代码或异常-这是ASP的最佳实践。网络服务?

  •  2
  • Vin  · 技术社区  · 17 年前

    我读过这个 thread 因为WCF有内置的自定义故障代码和东西。

    但什么是最佳实践 ASP。网 网络服务?我是抛出异常并让客户端处理异常,还是发送客户端需要处理的错误代码(成功、失败等)。

    更新:只是为了进一步讨论,以防 肥皂 ,假设客户制作了一个 web svc 调用应该是一条通知消息(不需要返回值),因此一切都很顺利,svc不会抛出任何异常。

    现在,客户端如何知道通知调用是否因通信/网络问题或服务器和客户端之间的问题而丢失?与没有抛出任何异常相比。客户可能会认为这是成功的。但事实并非如此。电话在某处丢失了。

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

    2 回复  |  直到 7 年前
        1
  •  2
  •   Community Mohan Dere    9 年前

    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
  •  1
  •   Sunny Milenov    17 年前

    这取决于您将如何使用web服务,即您将使用哪种协议。

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

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

    由于SOAP web服务旨在将调用代码视为正常的方法调用,因此相应的调用框架应该能够很好地处理和传播异常,从而使调用代码的外观和行为与处理内部调用一样。