2010-09-24 54 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 ... 

    } 

}