2013-01-10 101 views
0

我有了這個WSDL(服務是不是我的):http://soaptest.webapi-beta.gratka.pl/dom.html?wsdlWCF XML序列化失敗

當我得到法「pobierz_kategorie」迴應,我得到的是

的CommunicationException異常的錯誤在反序列化體的操作'pobierz_kategorie'的回覆消息。 {「XML文檔(2,501)中存在錯誤。」} {「指定的類型未被識別:name ='kategoria_drzewo',namespace ='http://soap.webapi-beta.gratka.pl/ dom.html',at。「}

我想問一下如何修改WSDL或WCF配置或生成的代理來使其工作。當我使用PHP調用該方法時,它可以工作,所以我想這必定是一些XMLSerializer問題。

此響應消息我得到:

<?xml version="1.0" encoding="UTF-8"?> 
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://soap.webapi-beta.gratka.pl/dom.html" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> 
    <SOAP-ENV:Body> 
     <ns1:pobierz_kategorieResponse> 
      <drzewo_kategorii SOAP-ENC:arrayType="ns1:kategoria_drzewo[48]" xsi:type="ns1:drzewo_kategorii"> 
       <item xsi:type="ns1:kategoria_drzewo"> 
        <id xsi:type="xsd:int">382</id> 
        <nazwa xsi:type="xsd:string">Dom</nazwa> 
        <dane xsi:type="xsd:string">0</dane> 
        <id_rodzic xsi:type="xsd:int">1</id_rodzic> 
        <poziom xsi:type="xsd:int">0</poziom> 
        <id_prasa xsi:type="xsd:int">2</id_prasa> 
       </item> 
       <item xsi:type="ns1:kategoria_drzewo"> 
        <id xsi:type="xsd:int">8251</id> 
        <nazwa xsi:type="xsd:string">Pokoje</nazwa> 
        <dane xsi:type="xsd:string"/> 
        <id_rodzic xsi:type="xsd:int">382</id_rodzic> 
        <poziom xsi:type="xsd:int">1</poziom> 
        <id_prasa xsi:type="xsd:int">0</id_prasa> 
       </item> 
      </drzewo_kategorii> 
     </ns1:pobierz_kategorieResponse> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

也就是說請求:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" xmlns:q1="http://soaptest.webapi-beta.gratka.pl/dom.html"> 
    <s:Body s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
     <q1:pobierz_kategorie> 
      <sesja xsi:type="xsd:string">ad9e730460e334b916c95533c8da320003ac7e14</sesja> 
      <id_kategoria xsi:type="xsd:int">382</id_kategoria> 
     </q1:pobierz_kategorie> 
    </s:Body> 
</s:Envelope> 
+0

@ user1121956你可以張貼的要求以及 –

+0

@NickRyan我添加了請求 – user1121956

回答

1

我檢索到WSDL和響應消息名稱不匹配,你有什麼上面。 如果您在wsdl中有pobierz_kategorieResponse,那麼在WSDL定義中它是pobierz_kategorie_wyjscie

消息 ...

<message name="pobierz_kategorie_wyjscie"> 
    <part name="drzewo_kategorii" type="tns:drzewo_kategorii"/> 
    </message> 

操作 ...

<operation name="pobierz_kategorie"> 
    <input message="tns:pobierz_kategorie_wejscie"/> 
    <output message="tns:pobierz_kategorie_wyjscie"/> 
</operation> 

也許你需要重新生成服務引用或在不同的端點指向它。

編輯

您可能需要自定義reference.cs文件(您生成的WCF客戶端代碼)來處理SOAP數組。我自己沒有這樣做,但有一個關於它的SO文章: -
Why won't .NET deserialize my primitive array from a web service?
我不是100%確定這是否與您的問題相同。它看起來像你需要明確告訴WCF--對於這個元素,這是你如何反序列化數組。對不起,我不能有更多的幫助。

編輯#2
有實際執行發佈到您的WSDL之間的不匹配「soaptest」和。請注意命名空間。或者,您已經生成了測試wsdl端點的代碼,並將其指向prod端點。請參閱下面的命名空間。
您的要求的命名空間是這樣的: -

但響應的命名空間是這樣的: -

那是不是要去工作!

嘗試生成您的WCF客戶端關閉

,而不是關閉

+0

其實我沒有關於WSDL的知識,但是你是對的,如果WSDL中沒有這樣的東西,那麼從服務器響應生成帶有「響應」字的標記是很奇怪的。 WSDL是否可能與真實的Web服務代碼不匹配? – user1121956

+0

@ user1121956請參閱上面的編輯#2。 –

+0

OMG,它的工作!正如你建議他們從生產服務器的測試服務器指向WSDL的實現,所以名稱空間不適合。非常感謝你! – user1121956