2010-04-12 59 views
0

我有一個Web服務,當它作爲Web引用添加到我的C#項目中時,我想訪問它。 Web服務中的特定方法使用SQL查詢字符串並將查詢結果作爲自定義類型返回。當我添加Web服務引用時,該方法顯示爲返回DataSet[]而不是自定義類型。這很好,只要我仍然能以某種方式訪問​​從這些DataSet對象中的查詢返回的數據。我運行了一個應該返回6行的特定查詢;我回來了一個DataSet[]陣列與6個元素。但是,當我遍歷這些對象時,它們都沒有任何表格(通過DataSet上的Tables屬性)。是什麼賦予了?我的數據在哪裏?從Web服務返回的DataSet對象數組中獲取數據

當我在報表生成器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 
} 

編輯:這裏有什麼方法看起來像當我加入的是得到了創建的自動生成Reference.cs Web引用:

[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響應,我可以做得更好。我怎樣才能做到這一點,而不是獲得「翻譯」版本,作爲DataSet[]

+0

您是否驗證過他們是Sysytem.Data.Dataset? – 2010-04-12 19:39:49

+0

@亨克:更新了我的問題以顯示Web服務方法的返回類型。 – 2010-04-12 19:45:08

+0

如果您在服務器端發佈WebNethod的(標題),它可能會有所幫助。 – 2010-04-12 19:55:51

回答

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得到我想要的數據,這是表示DataSet[],我從網上得到備份數據服務,當我使用網絡參考。我已經有了一個實現了IXmlSerializable的類,所以一旦我使用XPath導航返回的XML,我只需將XmlReader傳遞給我的類的ReadXml方法,並且會填充類實例。