错误代码或者异常-ASP.Net Web服务的最佳实践是什么?

时间:2020-03-05 18:57:26  来源:igfitidea点击:

我已经阅读了该线程,因为WCF具有内置的"自定义故障"代码和内容。

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

更新:只是为了进一步讨论SOAP,假设客户端进行了一个websvc调用,该调用应该是一条通知消息(预期没有返回值),因此一切顺利,并且svc不会引发任何异常。

现在,客户端将如何得知通知呼叫是否由于通信/网络问题或者服务器与客户端之间发生故障而丢失了?将其与没有引发任何异常进行比较。客户可能会认为这是成功的。但事实并非如此。呼叫在某处丢失。
发送"成功"错误代码是否可以确保客户端通话顺利?还有其他方法可以实现这一目标吗?甚至上述方案是否可能?

解决方案

回答

取决于我们要如何使用Web服务,即要使用哪种协议。

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

如果是SOAP,则抛出自定义异常是完全可以的(我们不希望返回内部框架异常,因为它们可能向外部各方显示一些堆栈跟踪等)。

由于SOAP Web服务恰好旨在将调用代码视为普通方法调用,因此相应的调用框架应该能够很好地处理和传播异常,从而使调用代码在处理内部调用时具有外观和行为。 。

回答

杰夫·阿特伍德(Jeff Atwood)不久前发布了有关该主题的有趣文章。尽管.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

更多信息为什么在这个问题上肥皂故障会更好。