2010-04-12 100 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方法,并且会填充类实例。

相关问题