2013-01-10 79 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