[英]Getting data from array of DataSet objects returned from web service
将Web服务添加为C#项目的Web引用时,我要访问一个Web服务。 Web服务中的特定方法采用SQL查询字符串,并将查询结果作为自定义类型返回。 当我添加Web服务引用时,该方法显示为返回DataSet[]
而不是自定义类型。 如果我仍然可以通过某种方式访问那些DataSet
对象中的查询返回的数据,这很好。 我运行了一个特定的查询,该查询应返回6行; 我得到了一个包含6个元素的DataSet[]
数组。 但是,当我遍历那些DataSet
对象时,它们都没有任何表(通过DataSet
的Tables
属性)。 是什么赋予了? 我的数据在哪里?
当我将Web服务用作Report Builder 2.0报表中的数据源时,该Web服务已经过测试并且可以工作。 我能够将XML SOAP查询发送到Web服务,并获取包含我的数据的XML结果。
这是我如何获取DataSet[]
数组的示例:
var service = new MyWebService
{
Credentials = System.Net.CredentialCache.DefaultCredentials
};
DataSet[] dataSets = service.MethodThatReturnsQueryResults(queryString);
// The body of this loop is skipped:
foreach (DataSet ds in dataSets.Where(ds => ds.Tables.Count > 0))
{
// extract data from DataSet ds
}
编辑:这是添加Web参考时创建的自动生成的Reference.cs中方法的外观:
[return: System.Xml.Serialization.XmlArrayItemAttribute("SomeCustomType")]
public System.Data.DataSet[] MethodThatReturnsQueryResults(
string selectSQLQuery) {
object[] results = this.Invoke("MethodThatReturnsQueryResults",
new object[] { selectSQLQuery});
return ((System.Data.DataSet[])(results[0]));
}
因此,它肯定会返回System.Data.DataSet[]
,但是我想知道是否正在发生某种事情,以致于该Web服务中使用的自定义类型SomeCustomType
在该自动生成的方法中未正确转换,因此空了DataSet
对象。 我不愿意编辑此自动生成的方法。 我可以访问Web服务代码; 我应该做些什么以确保SomeCustomType
可以SomeCustomType
为DataSet[]
?
编辑:我觉得如果我从Web服务获得原始XML SOAP响应,我会做得更好。 如何做到这一点,而不是获得作为DataSet[]
返回的“翻译”版本?
我结束了除去我的项目中的Web服务的参考,而是写了一个实用工具类,用于发送SOAP请求和获取响应回XML,由于本教程 。 以下是一些摘要:
public XmlDocument SendSoapRequest(XmlDocument soapRequest)
{
var webRequest = getWebRequest();
Stream requestStream = webRequest.GetRequestStream();
soapRequest.Save(requestStream);
requestStream.Close();
WebResponse webResponse = webRequest.GetResponse();
requestStream = webResponse.GetResponseStream();
var soapResponse = new XmlDocument();
soapResponse.Load(new XmlTextReader(new StringReader(
new StreamReader(requestStream).ReadToEnd()
)));
return soapResponse;
}
private HttpWebRequest getWebRequest()
{
var webRequest = (HttpWebRequest)WebRequest.Create(Url);
webRequest.Credentials = CredentialCache.DefaultCredentials;
webRequest.Headers.Add("SOAPAction", SoapAction);
webRequest.ContentType = ContentType;
webRequest.Accept = AcceptHeader;
webRequest.Method = RequestMethod;
return webRequest;
}
然后,我使用XPath查询来导航返回的XmlDocument
并获取所需的数据,这些数据没有显示在使用Web引用时从Web服务获取的DataSet[]
中。 我已经有一个实现IXmlSerializable
的类,因此一旦我使用XPath导航返回的XML,就只需将XmlReader
传递给类的ReadXml
方法,即可填充该类实例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.