2008-09-16 30 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