我读过这个 线 WCF 具有内置的自定义故障代码和内容。

但最好的做法是什么 网络应用程序 网页服务?我是否抛出异常并让客户端处理异常或发送客户端依赖其进行处理的错误代码(成功、失败等)。

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

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

发送“成功”错误代码是否可以向客户端确保呼叫顺利进行?有没有其他方法可以实现这一点,或者上面的情况是否可能?

有帮助吗?

解决方案

杰夫·阿特伍德发表 一篇有趣的文章 前段时间关于这个话题。尽管 .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

更多信息为什么肥皂故障更好 在这个问题中.

其他提示

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top