我们尝试使用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服务代理类?
答案 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 ...
}
}