2009-04-14 44 views
2

我有一個Web服務方法,我想拋出一些自定義異常,例如SomeException,SomeOtherException等等,然後Web服務會變成客戶端能夠處理的SOAP錯誤。在Java中,我可以在WSDL中的wsdl:operation元素中包含wsdl:fault元素。看起來.NET不適合這種情況,並且沒有辦法在WebMethod上放置屬性來顯示可能發生的SOAP錯誤。.NET 2.0 Web服務被忽略的WSDL故障元素?

如果我創建了一個具有wsdl:fault元素的Java web服務並向.NET項目添加了一個web引用,我會期望wsdl:fault元素可以創建正確命名的異常,就像其他實體一樣創建,但這似乎並不是這樣。

難道WSDL的情況:故障的WSDL元素由.NET完全地被忽略?它們是定義在http://www.w3.org/TR/wsdl處的WSDL規範的一部分,所以這不是我期待的行爲。

如果這是可能的變通可能被返回它包含一個成功/失敗的布爾值和錯誤消息/枚舉結果對象的情況。或者使用SoapExceptions。如果我選擇使用SoapExceptions,那麼我將把這個想法放在我的web服務的用戶上來處理這些問題並正確地反序列化它。這兩種方法似乎都不是處理這種問題的好方法,並添加了額外的問題和代碼來解決此問題。

有什麼建議嗎?

+0

?如果它是瀏覽器中的Silverlight,那麼在處理SOAP錯誤方面存在缺陷。 – sipwiz 2009-04-14 13:45:17

+0

客戶端是一個ASP.NET網站。 – Martin 2009-04-14 13:48:20

回答

3

既然你問到了.NET 2.0我想你知道,這是在WCF「固定」在這裏你可以添加屬性[FaultContract(typeof運算(YourCustomException))。

「正常」的方式這是在做2.0是你說,增加的響應消息成功布爾,結果和Error屬性。

您通常可以看到這是如何在EntLib中完成的。

+0

是啊,我堅持與.NET 2,我也知道,在WCF並希望有一些方法來實現[FaultContract(typeof運算(YourCustomException))]在.NET 2 SOAP Web服務,我是俯瞰,但看起來就像那不是這樣。 – Martin 2009-04-14 14:06:38

2

ASMX Web服務不支持客戶端或服務器上的wsdl:fault元素。他們永遠不會。

正如ThorHalvor說,這樣做的錯誤修復被稱爲「WCF」。

我已成功手寫一個WSDL包括WSDL:故障元件,則通過包括故障消息作爲的SoapException的詳細屬性返回通過ASMX web服務的那些故障。然後,Java和WCF客戶端將此視爲適當類型的例外。

您正在使用什麼類型的客戶端
2
[return: System.Xml.Serialization.XmlElementAttribute("ResultWS", typeof(ResultWS), Namespace = "http://...")] 
[return: System.Xml.Serialization.XmlElementAttribute("ResultFaultWS", typeof(ResultFaultWS), Namespace = "http://...")] 
public object SumTest_Operation([System.Xml.Serialization.XmlElementAttribute(Namespace = "http://...")] ParamWS param) 
{    
    ResultWS result = null; 
    try 
    { 
     result.Value = param.P1 + param.P2;    

    } 
    catch (Exception) 
    { 
     ResultFaultWS resultFault = new ResultFaultWS(); 
     resultFault.Status = noOK; 

     return resultFault;; 
    } 
    return result; 
}