我正在使用标准 wsdl(位于此处)与服务(OpenXDS)进行通信。我从中创建了一个服务引用,它生成了一个非常大的 Reference.cs 文件。文件中有一个类型层次结构,如下所示:
public partial class ExtrinsicObjectType : RegistryObjectType
. . .
[System.Xml.Serialization.XmlIncludeAttribute(typeof(ExtrinsicObjectType))]
public partial class RegistryObjectType : IdentifiableType
. . .
[System.Xml.Serialization.XmlIncludeAttribute(typeof(RegistryObjectType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(ExtrinsicObjectType))]
public partial class IdentifiableType : object
所有三种类型都具有相同的 XmlType:
[System.Xml.Serialization.XmlTypeAttribute(Namespace="urn:oasis:names:tc:ebxml-regrep:xsd:rim:3.0")]
IdentifiableType 对象的 Response 类型中有一个集合:
[System.Xml.Serialization.XmlArrayAttribute(Namespace="urn:oasis:names:tc:ebxml-regrep:xsd:rim:3.0", Order=0)]
[System.Xml.Serialization.XmlArrayItemAttribute("Identifiable", IsNullable=false)]
public IdentifiableType[] RegistryObjectList {
当服务实际响应时,它会给出一组 ExtrinsicObject 元素:
<rim:RegistryObjectList xmlns:rim="urn:oasis:names:tc:ebxml-regrep:xsd:rim:3.0">
<ns1:ExtrinsicObject xmlns:ns1="urn:oasis:names:tc:ebxml-regrep:xsd:rim:3.0" ...
<ns1:ExtrinsicObject xmlns:ns1="urn:oasis:names:tc:ebxml-regrep:xsd:rim:3.0" ...
<ns1:ExtrinsicObject xmlns:ns1="urn:oasis:names:tc:ebxml-regrep:xsd:rim:3.0" ...
<ns1:ExtrinsicObject xmlns:ns1="urn:oasis:names:tc:ebxml-regrep:xsd:rim:3.0" ...
<ns1:ExtrinsicObject xmlns:ns1="urn:oasis:names:tc:ebxml-regrep:xsd:rim:3.0" ...
</rim:RegistryObjectList>
我在跟踪日志中看到了这些元素,并且可以在 SoapUI 中得到相同的答案。但是当我从客户端代理返回反序列化响应时,RegistryObjectList 是空的。它完全忽略了 ExtrinsicObject 元素。
不能改服务器,客户端是VS2012生成的。看起来这应该可以工作,但我缺少一些设置或其他东西。
这是我到目前为止的理论:
- 服务参考上有一些设置,如果我检查它并更新代码,一切都会正常工作。
- 我使用的 wsdl 与他们同意的 wsdl 不同。
- 我将不得不弄清楚如何手动反序列化响应。
任何帮助表示赞赏。我试图包含我认为相关的内容,但是由于 wsdl、xsd 和 Reference.cs 都相当大,因此进行了很多编辑。