2008-09-16 56 views
1

我已阅读此thread WCF具有内置的自定义故障代码和东西。错误代码或异常 - 这是ASP.Net Web服务的最佳实践?

但ASP.Net网络服务的最佳做法是什么。我是否会抛出异常并让客户端处理异常或发送客户端依赖的错误代码(成功,失败等)来处理它。

更新:在SOAP的情况下进一步讨论,假设客户端进行一个应该是通知消息的websvc调用(没有期望的返回值),所以一切顺利,svc没有抛出任何异常。

现在客户如何知道由于通信/网络问题或服务器和客户端之间的问题导致通知呼叫丢失?比较这与没有任何异常抛出。客户可能会认为它是成功的。但事实并非如此。电话在某处丢失。 发送'成功'错误代码可以确保客户端的通话顺利吗?有没有其他方法可以实现这一目标,或者甚至可能是上述情况?

回答

2

Jeff Atwood在前段时间发布了an interesting aerticle关于此主题。虽然.NET异常转换为与大多数其他工具包兼容的SoapFault,但故障信息并不是很好。为此,文章的conlusion是.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

1

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

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

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

由于SOAP Web服务正好意味着将调用代码视为普通的方法调用,因此相应的调用框架应该能够处理和传播异常,从而使调用代码看起来和表现得像它一样处理内部电话。

+0

我真的很想知道为什么这是投下来的票?这完全相关。 – 2008-09-18 14:51:12