【问题标题】:WCF XML deserialization failWCF XML 反序列化失败
【发布时间】:2013-01-14 18:11:56
【问题描述】:

我有这个 WSDL(服务不是我的):http://soaptest.webapi-beta.gratka.pl/dom.html?wsdl

当我从方法“pobierz_kategorie”得到响应时,我得到了这样的异常

通讯异常 反序列化操作“pobierz_kategorie”的回复消息正文时出错。 {"XML 文档有错误 (2, 501)。"} {"指定的类型无法识别:name='kategoria_drzewo', namespace='http://soap.webapi-beta.gratka.pl/dom .html',位于 ."}

我想问一下如何修改 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>

【问题讨论】:

  • @user1121956 你也可以发布请求吗
  • @NickRyan 我添加了请求

标签: c# wcf


【解决方案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
发布给您“soaptest”的 wsdl 与实际实现之间存在不匹配。注意命名空间。或者,您已经生成了测试 wsdl 端点的代码并将其指向 prod 端点。请参阅下面的命名空间。
您的请求的命名空间如下所示:-

但是响应的命名空间看起来像这样:-

那是行不通的!

尝试关闭您的 WCF 客户端

而不是关闭

【讨论】:

  • 其实我对WSDL一无所知,但你说得对,如果WSDL中没有这样的东西,来自服务器的响应会生成带有“响应”字样的标签,这很奇怪。 WSDL 是否可能与真实的 Web 服务代码不匹配?
  • 天啊,它的工作!正如您所建议的那样,他们的实现从测试服务器指向生产服务器的 WSDL,因此名称空间不适合。非常感谢!
  • 顺便说一句。你知道“wejscie/wyjscie”怎么可能变成请求/响应词?这是一些魔术还是只是正常的 WS-* 行为?
  • @user1121956 不,我不知道为什么会这样。据我所知不正常。无论如何,你已经启动并运行。编码愉快!
猜你喜欢
  • 2015-03-29
  • 1970-01-01
  • 2012-12-26
  • 2021-04-07
  • 2013-08-05
  • 2013-01-05
  • 1970-01-01
  • 2023-03-30
  • 2013-11-16
相关资源
最近更新 更多