2009-07-20 117 views
6

我的web服務方法返回一個集合對象,這將很好地序列化,這要感謝C#web服務的工作方式!如何從ASMX Web服務返回錯誤?

但是,如果我的代碼拋出一個未捕獲的異常,我想要返回一個自定義錯誤對象。

這可能使用C#ASP.NET v2嗎?

例如,

正常操作應該返回:

<Books> 
    <book>Sample</book> 
    <book>Sample</book> 
</Books> 

但在錯誤我想

<error> 
     <errorMessage></errorMessage> 
    </error> 
+0

請注意,ASMX Web服務不能正確支持SOAP故障。生成的WSDL不會定義錯誤,導致某些客戶端忽略它們或在收到錯誤時返回致命錯誤。使用WCF來避免這個問題。 – 2010-11-26 23:24:53

回答

7

是的,這是可能的。

你需要研究的是SoapException class,特別是SoapException類的Detail property

SoapException類將有效地呈現「Soap Fault」,這是一種從Web服務方法向客戶/消費者返回錯誤信息的標準兼容機制。

SoapException類的「Detail」屬性類型爲XmlNode,因此可以包含單個節點/元素或子節點層次結構。因此,Detail節點可以輕鬆包含並充當您自己的自定義錯誤對象的序列化表示的「父」。

從MSDN:

細節屬性旨在提供相關的SOAP請求的主體元件應用特定錯誤詳細信息。根據SOAP規範,如果由於SOAP請求的Body元素而無法處理客戶端請求而發生錯誤,則必須設置Detail屬性。如果在SOAP請求的標題條目中發生錯誤,則必須拋出SoapHeaderException,以便在SOAP標題中返回錯誤詳細信息。如果錯誤未發生,由於Body元素的處理,則不能設置Detail屬性。

在爲Detail屬性構建XmlNode時,可以使用DetailElementName的Name和Namespace屬性來確保與SOAP規範的一致性[sic]。

細節元素的所有直接子元素都稱爲細節條目,每個細節條目都編碼爲細節元素中的獨立元素。

需要注意的是,如果你想正確地保持SOAP符合您的web服務響應,你需要返回SoapHeaderException而非的SoapException 如果原始XML請求的客戶端的報頭部分中出現錯誤(當使用custom SOAP headers作爲例如安全證書時,情況經常會如此),如上所述。

+0

你能舉個例子嗎? – 2009-07-20 14:20:47