我正在从.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生成的企业节点类。
[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;
.Net无法反序列化&#34;地址&#34;,&#34; country&#34;,&#34; region&#34;,&#34; numberList&#34;节点
这是国家节点的.Net生成类如何为空的示例。
[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;
有什么想法吗?
答案 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正确的序列化。 但接下来的问题是如何正确编辑它们?