2009-12-05 92 views
1

我從WSDL文件生成了一個WCF代理,但現在當我調用代理方法時,它們返回null。我已啓用消息日誌記錄,並可以看到來自服務器的消息正確返回。從WSDL生成的WCF代理,代理方法返回null

我已經檢查了this問題的答案,但在我的情況下,至少返回的對象的名稱在消息和WSDL中是相同的。我仍然認爲這個問題與WSDL文件有關,因爲它不是通過「?wsdl」URL(它是第三方web服務)的常用方式獲取的,但是是單獨給出的。

該方法的返回類型只是一個字符串。

有沒有其他人有類似的問題,以及有什麼相應的解決方案,如果有的話?問題的最可能來源是什麼?

重新編輯:

這是一個RPC /編碼的Web服務。正如所寫,我可以通過消息日誌查看SOAP響應,但WCF似乎無法解析信息。

從服務響應的消息部分看起來是這樣的:

<ns1:ServiceResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="the target namespace"> 
    <ns1:ReturnValue xsi:type="xsd:string"> 

不過,從我的客戶檢查傳出消息的時候,它的不同:

<ns1:ServiceRequest soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="the target namespace"> 
    <RequestValue xsi:type="xsd:string" xmlns=""> 

所以也許代理預期響應具有相同的名稱空間結構,因此無法解析它。

我已經盡力了type屬性更改爲element在WSDL消息定義,並在WSDL定義的types部分加入一些新的元素,但隨後的SvcUtil工具生成代理時扼流圈,抱怨有衝突在推斷的樣式文檔和指定的樣式rpc之間。

WSDL specification,第3.5節:

如果使用是編碼,則每個消息部分引用使用類型屬性的抽象類型。

但後來我有點困惑,因爲它似乎沒有在這question問題。進行類似更改需要什麼,限制它是RPC /編碼服務?

+0

您是如何生成WSDL的? 您是否使用svcutil命令或在VSS中添加服務? 而且,你知道響應的格式(文本,MTOM?)以及它是什麼樣的web服務? – K2so 2009-12-05 19:06:54

+0

正確:您是如何從WSDL生成類的? – K2so 2009-12-05 19:07:24

回答

0

從Java Web服務對WSDL使用WCF客戶端時,我們有類似的東西。

我們的問題是,我們看不到從服務返回的數據,它看起來像數據丟失。

但是,當我們查看電線上發生了什麼時,數據就在那裏。

問題是WSDL有許多從其他類型繼承的類型。默認情況下,我們只會看到基本類型中的信息。

解決方法是將對象轉換爲我們預期的類型,然後出現所有字段。

+0

是的,這是我正在尋找的答案。然而在這種情況下它並不是真正的情況,因爲我正在處理基類型,所以整個對象(字符串)爲空,而不僅僅是它的一部分。 – 2009-12-06 08:07:52

2

您必須提供有關Java服務的詳細信息才能解決此問題。但是,我懷疑Java服務正在使用使用type屬性定義的消息部分。這些不符合WS-I Basic Profile 1,因爲對於消息的元素應該使用哪個名稱空間是不明確的。一些服務將使用該類型的名稱空間,而另一些服務將(正確)使用Web服務本身的名稱空間。

使用element屬性消除了歧義,因此是首選。

請張貼包含您遇到問題的消息之一的WSDL片段。然後,當您將消息的定義與您在網絡上看到的內容進行比較時,然後將其與代表該消息的代理類的詳細信息進行比較,我相信您會明白我的意思。代理類期望一個名稱空間,但在線上,正在使用不同的名稱空間。

+0

是的,在這種情況下,wsdl零件是用type屬性定義的。我會盡可能地嘗試,然後我會舉一個例子。 – 2009-12-06 08:37:02

+0

我嘗試添加一個元素,但後來我收到警告 「從運行中的消息推斷出的樣式文檔服務與通過綁定指定的預期樣式Rpc不匹配。」所以我懷疑我沒有在正確的位置添加元素。現在我已經在wsdl:types> schema下添加了。它在消息中被引用爲element =「tns:ReturnValue」。 – 2009-12-07 18:12:54