我正在使用标准的wsdl(位于here)与服务(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,xsd和Reference.cs都相当大,所以编辑很多。
答案 0 :(得分:0)
我通过将以下XmlAttributeOverrides传递给序列化程序来实现这一点:
var overrides = new XmlAttributeOverrides();
overrides.Add(typeof(SubmitObjectsRequest), "RegistryObjectList", new XmlAttributes
{
XmlArray = new XmlArrayAttribute()
{
Namespace = "urn:oasis:names:tc:ebxml-regrep:xsd:rim:3.0",
Order = 0
},
XmlArrayItems =
{
new XmlArrayItemAttribute("ExtrinsicObject", typeof(ExtrinsicObjectType)) { IsNullable = false },
new XmlArrayItemAttribute("RegistryPackage", typeof(RegistryPackageType)) { IsNullable = false }
}
});
据我所知,Reference.cs正如你所说的那样:
[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 {
但是,在XML中,RegistryObjectList
元素没有Identifiable
子节点,而是ExtrinsicObject
和RegistryPackage
子节点,我真正想要的是它看起来像这样:
[System.Xml.Serialization.XmlArrayAttribute(Namespace="urn:oasis:names:tc:ebxml-regrep:xsd:rim:3.0", Order=0)]
[System.Xml.Serialization.XmlArrayItemAttribute("ExtrinsicObject", typeof(ExtrinsicObjectType), IsNullable=false)]
[System.Xml.Serialization.XmlArrayItemAttribute("RegistryPackage", typeof(RegistryPackageType), IsNullable=false)]
public IdentifiableType[] RegistryObjectList {
包含覆盖使序列化程序忽略原始属性并将RegistryObjectList
视为用后者修饰。