ServiceContractGenerator类型问题

时间:2010-09-24 13:23:54

标签: web-services

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

下面的DataTable生成代码

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类可以处理DataTable,并返回DataTable对象

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

我们如何处理DataTable以生成Web服务代理类?

2 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:0)

我遇到了同样的问题,在调查后我做了以下解决了这个问题:

  • 通常你会在类中找到导致错误的两个属性:

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

我做的是以下内容:

1-将数组中的第一个属性更改为单个值变量,如下所示

private System.Xml.Linq.XElement anyField; 

2-更改此属性的getter和setter方法,以匹配您的更改

[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");
            }
        }


*/

此时,您现在可以通过调用“Any”属性来访问生成的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 ...

    }

}