[英]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.