从Web服务返回的DataSet对象数组中获取数据

时间:2010-04-12 19:25:44

标签: c# web-services dataset

我有一个Web服务,当我将它作为Web引用添加到我的C#项目时,我想访问它。 Web服务中的特定方法采用SQL查询字符串,并将查询结果作为自定义类型返回。当我添加Web服务引用时,该方法显示为返回DataSet[]而不是自定义类型。这很好,只要我仍然可以以某种方式访问​​那些DataSet对象中的查询返回的数据。我运行了一个应返回6行的特定查询;我找回了一个包含6个元素的DataSet[]数组。但是,当我遍历那些DataSet个对象时,它们都没有任何表(通过Tables上的DataSet属性)。是什么赋予了?我的数据在哪里?

当我在报表生成器2.0报表中将其用作数据源时,Web服务已经过测试并可以正常运行。我能够向Web服务发送XML SOAP查询并获取包含我的数据的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
}

编辑:以下是我添加网络参考时创建的自动生成的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可以投放到DataSet[]

编辑:如果我刚从Web服务中取回原始XML SOAP响应,我觉得我可以做得更好。我怎么能这样做而不是得到“{1}}”的“翻译”版本?

1 个答案:

答案 0 :(得分:1)

我最终从我的项目中删除了Web服务引用,而是编写了一个实用程序类,用于发送SOAP请求并以XML格式返回响应,感谢this tutorial。以下是几个片段:

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并获取我想要的数据, not 中的数据显示在我找回的DataSet[]中当我使用Web引用时从Web服务。我已经有一个实现IXmlSerializable的类,所以一旦我使用XPath导航返回的XML,我只需将XmlReader传递给我的类的ReadXml方法,然后填充类实例。