2010-09-24 34 views
1

我们尝试使用ServiceContractGenerator生成Web服务代理类。
我们在使用返回DataTable的Web服务时遇到问题。ServiceContractGenerator类型问题

生成以下

public partial class MethodResultOfDataTableymujubN2Result 
{ 

    private System.Xml.XmlElement[] anyField; 

    private System.Xml.XmlElement any1Field; 

    /// <remarks/> 
    [System.Xml.Serialization.XmlAnyElementAttribute(Namespace="http://www.w3.org/2001/XMLSchema", Order=0)] 
    public System.Xml.XmlElement[] Any 
    { 
     get 
     { 
      return this.anyField; 
     } 
     set 
     { 
      this.anyField = value; 
     } 
    } 

    /// <remarks/> 
    [System.Xml.Serialization.XmlAnyElementAttribute(Namespace="urn:schemas-microsoft-com:xml-diffgram-v1", Order=1)] 
    public System.Xml.XmlElement Any1 
    { 
     get 
     { 
      return this.any1Field; 
     } 
     set 
     { 
      this.any1Field = value; 
     } 
    } 
} 

的DataTable代码References.cs类可以处理数据表,并返回DataTable对象

[System.Runtime.Serialization.DataMemberAttribute()] 
public System.Data.DataTable Result { ... 

我们如何处理数据表生成Web服务代理类?

回答

2

以下方法解决

WsdlImporter wsdlImporter = CreateWsdlImporter(address); 
AddStateForDataContractSerializerImport(wsdlImporter); 

... 

private void AddStateForDataContractSerializerImport(WsdlImporter importer) 
{ 
    XsdDataContractImporter xsdDataContractImporter = new XsdDataContractImporter(); 
    xsdDataContractImporter.Options = new ImportOptions(); 

    xsdDataContractImporter.Options.ImportXmlType = true; 
    xsdDataContractImporter.Options.GenerateSerializable = true; 
    xsdDataContractImporter.Options.ReferencedTypes.Add(typeof(DataTable)); 

    importer.State.Add(typeof(XsdDataContractImporter), xsdDataContractImporter); 
} 
0

我都面临着同样的问题,调查后,我做了该解决的问题以下的问题:

  • 通常你会发现在类的两个属性导致错误:

    private System.Xml.Linq.XElement[] anyField; 
    
    
    private System.Xml.Linq.XElement any1Field; 
    

我所做的是以下内容:

1-改变第一属性从一个阵列到单个值变量如下

private System.Xml.Linq.XElement anyField; 

2-改变这个属性的获取和设置方法,以匹配更改

[System.Xml.Serialization.XmlAnyElementAttribute(Namespace="http://www.w3.org/2001/XMLSchema", Order=0)] 
    public System.Xml.Linq.XElement Any { 
     get { 
      return this.anyField; 
     } 
     set { 
      this.anyField = value; 
      this.RaisePropertyChanged("Any"); 
     } 
    } 

3-删除或注释掉的第二个属性

// private System.Xml.Linq.XElement any1Field; 

4-删除或注释掉第二个属性的getter和setter方法

/* 

[System.Xml.Serialization.XmlAnyElementAttribute(Namespace="urn:schemas-microsoft-com:xml-diffgram-v1", Order=1)] 
     public System.Xml.Linq.XElement Any1 { 
      get { 
       return this.any1Field; 
      } 
      set { 
       this.any1Field = value; 
       this.RaisePropertyChanged("Any1"); 
      } 
     } 


*/ 

此时通过调用“任何”属性,它会返回一个XML,您可以操控如下您现在可以访问生成的XML :

例如,在我的情况下,它是下面的类造成的问题

public partial class GetUserBalancesClassAccounts 

在我的方法,我能够访问XML如下

GetUserBalancesClassAccounts accts = balances.Accounts; 

XElement doc = accts.Any; 

foreach(XElement docElement in doc.Elements()){ 

    foreach (XElement account in docElement.Elements("Account")) 

    { 

     ... do something ... 

    } 

}