我有一个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}}”的“翻译”版本?
答案 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
方法,然后填充类实例。