我正在使用WCF客户端来调用JAX web服务。
当反序列化响应时,响应对象中的数组始终为空。但是,如果我使用消息检查器手动将名称空间添加到响应中的数组类型中,则会正确地反序列化响应。
所以我得到的回应是:
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" />
<S:Body>
<ns2:myResponse xmlns:ns2="http://mynamespace.com/">
<myArray>
<myObject>
<myString>abcde</myString>
<myInt>12345</myInt>
</myObject>
</myArray>
<id>7777</id>
</ns2:myResponse>
</S:Body>
</S:Envelope>
这将生成一个myResponse类型的对象,该对象具有正确的"id"字段,但myArray字段为myObject类型的空数组。
当我手动编辑收到的消息,在myObject标记之前添加命名空间别名"ns2"时,它看起来像这样:
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" />
<S:Body>
<ns2:myResponse xmlns:ns2="http://mynamespace.com/">
<myArray>
<ns2:myObject>
<myString>abcde</myString>
<myInt>12345</myInt>
</ns2:myObject>
</myArray>
<id>7777</id>
</ns2:myResponse>
</S:Body>
</S:Envelope>
正确的对象被反序列化,即使用包含正确myObject的大小为1的myArray。
有人能告诉我为什么会这样,以及我如何在没有手动干预的情况下使WCF反序列化正确工作吗?
不确定这是否正是您的问题,但可能值得一试。
我们也遇到过类似的问题。在我们的例子中,有一个复杂的对象正在被反序列化,缺少几个字段。使用调试器,我们可以看到信息就在那里。但我们无法通过代码找到它。
对我们有效的方法是将对象强制转换为包含所有字段的类型。
检查您的references.cs文件,其中定义了哪些数据类型?