.Net(C#)无法反序列化Java Web服务响应

时间:2014-11-13 14:43:35

标签: c# xml web-services wsdl

我正在从.Net应用程序中使用基于Java的Web服务。问题出现了,当我从Web服务获得反序列化响应时,响应中的一些字段带有空值,但如果我查看xml响应,则响应具有正确的值。所以我猜主要问题是.Net无法正确反序列化响应。 Here is WSDL,我使用的方法是" GetForeignEnterpriseList"。

XML响应是

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Header xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" />
  <S:Body>
    <ns6:getForeignEnterpriseListResponse xmlns="http://api.vetrf.ru/schema/base" xmlns:ns2="http://api.vetrf.ru/schema/argus" xmlns:ns3="http://api.vetrf.ru/schema/institutions" xmlns:ns4="http://api.vetrf.ru/schema/ikar" xmlns:ns5="http://api.vetrf.ru/schema/base/register" xmlns:ns6="http://api.vetrf.ru/schema/argus/enterprise/ws-definitions" xmlns:ns7="http://api.vetrf.ru/schema/argus/ws-definitions">
      <ns2:enterpriseList offset="0" total="14058" count="1">
        <ns2:enterprise>
          <uuid>06e4a78e-053d-11e1-99b4-d8d385fbc9e8</uuid>
          <guid>cb1483ab-2c7d-db46-445c-09849ae9b761</guid>
          <active>true</active>
          <last>true</last>
          <status>100</status>
          <createDate>2009-10-08T12:50:47+04:00</createDate>
          <updateDate>2009-10-08T12:50:47+04:00</updateDate>
          <ns2:name>Cargill Meat Solutions Corporation</ns2:name>
          <ns2:englishName>
          </ns2:englishName>
          <ns2:activity>Убой КРС, разделка, хранение говядины</ns2:activity>
          <ns2:englishActivity>Cattle slaughter, Beef cutting, Beef storage</ns2:englishActivity>
          <ns4:address>
            <ns4:addressView>Friona</ns4:addressView>
            <ns4:enAddressView>
            </ns4:enAddressView>
          </ns4:address>
          <ns4:country>
            <uuid>91134526-4373-ec59-4a1e-e0e99bd50b7b</uuid>
            <guid>cac8a802-3c65-397d-895d-c0495bf6ea61</guid>
          </ns4:country>
          <ns4:region>
            <uuid>c7bad316-6564-787c-c502-6a9e8afdc093</uuid>
            <guid>bbee471c-0548-7190-cca9-5897eedbeac3</guid>
            <ns4:hasStreets>false</ns4:hasStreets>
          </ns4:region>
          <ns2:numberList>
            <ns2:enterpriseNumber>86 Е</ns2:enterpriseNumber>
          </ns2:numberList>
        </ns2:enterprise>
      </ns2:enterpriseList>
    </ns6:getForeignEnterpriseListResponse>
  </S:Body>
</S:Envelope>

这是我需要获得的.Net生成的企业节点类。

&#13;
&#13;
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.18408")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.vetrf.ru/schema/argus")]
    public partial class Enterprise : GenericVersioningEntity {
        
        private string nameField;
        
        private string englishNameField;
        
        private string activityField;
        
        private string englishActivityField;
        
        private Address addressField;
        
        private Country countryField;
        
        private Region regionField;
        
        private District districtField;
        
        private string[] numberListField;
        
        private string typeField;
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=0)]
        public string name {
            get {
                return this.nameField;
            }
            set {
                this.nameField = value;
                this.RaisePropertyChanged("name");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=1)]
        public string englishName {
            get {
                return this.englishNameField;
            }
            set {
                this.englishNameField = value;
                this.RaisePropertyChanged("englishName");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=2)]
        public string activity {
            get {
                return this.activityField;
            }
            set {
                this.activityField = value;
                this.RaisePropertyChanged("activity");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=3)]
        public string englishActivity {
            get {
                return this.englishActivityField;
            }
            set {
                this.englishActivityField = value;
                this.RaisePropertyChanged("englishActivity");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=4)]
        public Address address {
            get {
                return this.addressField;
            }
            set {
                this.addressField = value;
                this.RaisePropertyChanged("address");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=5)]
        public Country country {
            get {
                return this.countryField;
            }
            set {
                this.countryField = value;
                this.RaisePropertyChanged("country");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=6)]
        public Region region {
            get {
                return this.regionField;
            }
            set {
                this.regionField = value;
                this.RaisePropertyChanged("region");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=7)]
        public District district {
            get {
                return this.districtField;
            }
            set {
                this.districtField = value;
                this.RaisePropertyChanged("district");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlArrayAttribute(Order=8)]
        [System.Xml.Serialization.XmlArrayItemAttribute("enterpriseNumber", IsNullable=false)]
        public string[] numberList {
            get {
                return this.numberListField;
            }
            set {
                this.numberListField = value;
                this.RaisePropertyChanged("numberList");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(DataType="integer", Order=9)]
        public string type {
            get {
                return this.typeField;
            }
            set {
                this.typeField = value;
                this.RaisePropertyChanged("type");
            }
        }
    }
&#13;
&#13;
&#13;

.Net无法反序列化&#34;地址&#34;,&#34; country&#34;,&#34; region&#34;,&#34; numberList&#34;节点

这是国家节点的.Net生成类如何为空的示例。

&#13;
&#13;
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.18408")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://api.vetrf.ru/schema/ikar")]
    public partial class Country : GenericVersioningEntity {
        
        private string nameField;
        
        private string fullNameField;
        
        private string englishNameField;
        
        private string codeField;
        
        private string code3Field;
        
        private bool isRussiaField;
        
        private bool isRussiaFieldSpecified;
        
        private bool isCustomsUnionField;
        
        private bool isCustomsUnionFieldSpecified;
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=0)]
        public string name {
            get {
                return this.nameField;
            }
            set {
                this.nameField = value;
                this.RaisePropertyChanged("name");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=1)]
        public string fullName {
            get {
                return this.fullNameField;
            }
            set {
                this.fullNameField = value;
                this.RaisePropertyChanged("fullName");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=2)]
        public string englishName {
            get {
                return this.englishNameField;
            }
            set {
                this.englishNameField = value;
                this.RaisePropertyChanged("englishName");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=3)]
        public string code {
            get {
                return this.codeField;
            }
            set {
                this.codeField = value;
                this.RaisePropertyChanged("code");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=4)]
        public string code3 {
            get {
                return this.code3Field;
            }
            set {
                this.code3Field = value;
                this.RaisePropertyChanged("code3");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=5)]
        public bool isRussia {
            get {
                return this.isRussiaField;
            }
            set {
                this.isRussiaField = value;
                this.RaisePropertyChanged("isRussia");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlIgnoreAttribute()]
        public bool isRussiaSpecified {
            get {
                return this.isRussiaFieldSpecified;
            }
            set {
                this.isRussiaFieldSpecified = value;
                this.RaisePropertyChanged("isRussiaSpecified");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Order=6)]
        public bool isCustomsUnion {
            get {
                return this.isCustomsUnionField;
            }
            set {
                this.isCustomsUnionField = value;
                this.RaisePropertyChanged("isCustomsUnion");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlIgnoreAttribute()]
        public bool isCustomsUnionSpecified {
            get {
                return this.isCustomsUnionFieldSpecified;
            }
            set {
                this.isCustomsUnionFieldSpecified = value;
                this.RaisePropertyChanged("isCustomsUnionSpecified");
            }
        }
    }
&#13;
&#13;
&#13;

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

由于xml命名空间,所有的ns2:,ns4:等等。

你可以从消息文本中删除它们,包括命名空间声明,hacky但很快。或者您可以通过在对象中包含名称空格来正确地执行此操作

XmlRoot(Namespace = "http://api.vetrf.ru/schema/")]
public class Enterprise
{
    [XmlElement(Namespace = "http://api.vetrf.ru/schema/ikar")]
    public Address Address{ get; set; }
    [XmlElement(Namespace = "http://api.vetrf.ru/schema/ikar")]
    public Country Country { get; set; }

   ...
}

XmlRoot(Namespace = "http://api.vetrf.ru/schema/ikar")]
public class Address
{
 ....    
}

没有尝试过这样的猜测,祝你好运!

答案 1 :(得分:0)

问题是由.Net解释给定的wsdl。 在国家实体的WSDL字段中描述为

这里的主要问题是.Net解释minOccurs =“0”maxOccurs =“1”属性。

当肥皂反应出现时

<ns4:country>
	<uuid>91134526-4373-ec59-4a1e-e0e99bd50b7b</uuid>
	<guid>cac8a802-3c65-397d-895d-c0495bf6ea61</guid>
</ns4:country>

.Net无法正确反序列化,并将country对象设为null。我无法访问“country”对象的字段。我认为这是因为.Net期望接收填充了所有字段的“country”对象,但只有两个字段。 但是当我通过NetBeans使用Web服务时,'country'对象随附所有字段。除了uuid和guid字段外,这些字段为null。

目前我复制了wsdl和所有xsd文件,并希望修改它们以进行.Net正确的序列化。 但接下来的问题是如何正确编辑它们?

相关问题