2008-09-15 61 views
10

我正在編寫一個C#客戶端,它調用由Java(由另一個人)編寫的Web服務。我已經爲我的客戶添加了一個Web引用,並且我可以在Web服務中調用方法。編寫C#客戶端以使用返回對象數組的Java Web服務

服務被更改爲返回一個對象數組,客戶端沒有正確解析返回的SOAP消息。

MyResponse[] MyFunc(string p) 

class MyResponse 
{ 
    long id; 
    string reason; 
} 

當我的生成的C#代理調用web服務(使用SoapHttpClientProtocol.Invoke),我期待具有1長度的MyResponse []數組,即一個單一的元件。無論服務實際返回什麼,Invoke調用後的內容都是id = 0和reason = null的元素。使用數據包嗅探器,我可以看到服務正在返回看起來是合法的soap消息,id和理由設置爲非空值。

是否有一些技巧讓C#客戶端調用返回someobject []的Java Web服務?如有必要,我將努力獲得一個消毒過的演示。

編輯:這是通過「添加Web引用...」的Web引用。 VS 2005,.NET 3.0。

+0

您是使用「添加Web引用」(.NET 2.0)還是「添加服務引用」(.NET 3.0)? – 2008-09-15 17:19:43

回答

3

已經有一段時間了,但我似乎記得在.NET和Java Web服務之間處理默認命名空間的細微差別時遇到了麻煩。

根據Java服務的期望,仔細檢查生成的c#代理類和任何名稱空間(特別是缺省值xmlns =「」)中聲明的名稱空間。可能會有非常微妙的差異,您將不得不重新創建。

如果是這種情況,那麼您將在c#屬性中提供更多的名稱空間聲明。

0

從你的問題看,你有一個客戶端工作,然後服務被更改爲返回一個數組。確保您重新生成代理,以便在客戶端上反序列化返回的SOAP消息。目前尚不清楚你是否做到了這一點 - 只是確保。

+0

你的理解是正確的。直到我添加了返回MyResponse []的方法後,它纔開始工作。我刷新了參考資料,並且重建了代理。 – 2008-09-15 20:30:49

8

感謝西安,我有一個解決方案。

該服務的WSDL包括一個線

<import namespace="http://mynamespace.company.com"/> 

發送到服務器的客戶端對所有數據元素的以下屬性的皁:

xmlns="http://mynamespace.company.com" 

但是的XML有效載荷響應(從服務返回給客戶端)沒有有包括這個命名空間。通過修改HTTP響應(我通過WireShark獲得),我觀察到,如果我強制每個返回的數據元素都使用xmlns屬性,則.NET代理類會正確地獲取MyResponse值。

短期改變服務,這是我無法控制的,解決方法是編輯VS生成的代理類(如Reference.cs)和尋找這樣的臺詞:

[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://mynamespace.company.com")] 
public partial class MyResponse { 

,並註釋掉XmlType屬性行。這將告訴CLR在默認命名空間中查找響應元素,而不是在wsdl中指定的響應元素。每次更新引用時都必須重做此操作,但至少可以工作。

+0

感謝您發佈您的解決方案,它帶回了大量的回憶! – Xian 2008-09-24 21:22:09