2010-09-24 5 views
1

Nous essayons de générer une classe de proxy de service Web à l'aide de ServiceContractGenerator.
Nous obtenons des problèmes lors de l'utilisation de services Web qui retournent DataTable.Problème de type ServiceContractGenerator

code généré pour DataTable ci-dessous

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; 
     } 
    } 
} 

References.cs classe peut gérer DataTable et retourner l'objet DataTable

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

Comment pouvons-nous gérer DataTable pour générer la classe proxy de service Web?

Répondre

2

ci-dessous méthode résoudre le problème

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

J'ai fait face au même problème et après enquête que j'ai fait ce qui suit qui a résolu le problème:

  • vous trouverez généralement deux propriétés dans la classe provoquant l'erreur:

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

Ce que je l'ai fait était la suivante:

1- changé la première propriété d'un tableau à une seule variable de valeur comme suit

private System.Xml.Linq.XElement anyField; 

2- changer les méthodes getter et setter de cette propriété, en fonction vos modifications

[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- supprimer ou commenter la deuxième propriété

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

4- supprimer ou commenter le deuxième getter de la propriété et les méthodes 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"); 
      } 
     } 


*/ 

À ce stade, vous pouvez maintenant accéder au XML résultant comme suit en appelant la propriété « Tout » qui retourne un xml que vous pouvez manipuler :

par exemple, dans mon cas, il a été la classe suivante à l'origine des problèmes

public partial class GetUserBalancesClassAccounts 

dans ma méthode, j'ai pu accéder au xml comme suit

GetUserBalancesClassAccounts accts = balances.Accounts; 

XElement doc = accts.Any; 

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

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

    { 

     ... do something ... 

    } 

}   
Questions connexes