2010-04-12 5 views
0

C# 프로젝트에 대한 웹 참조로 추가 될 때 액세스하려는 웹 서비스가 있습니다. 웹 서비스의 특정 메서드는 SQL 쿼리 문자열을 사용하고 쿼리의 결과를 사용자 지정 형식으로 반환합니다. 웹 서비스 참조를 추가하면 메소드가 사용자 정의 유형 대신 DataSet[]을 반환하는 것으로 나타납니다. 이것들은 여전히 ​​DataSet 개체 내의 쿼리에서 반환 된 데이터에 어떻게 든 액세스 할 수 있다면 괜찮습니다. 6 행을 반환해야하는 특정 쿼리를 실행했습니다. 나는 6 원소로 DataSet[] 배열을 되찾았다. 그러나 DataSet 개체를 반복 할 때 어떤 테이블도 가지고 있지 않습니다 (Tables 속성을 통해 DataSet에 있음). 뭐라 구요? 내 데이터는 어디에 있습니까?웹 서비스에서 반환 된 DataSet 객체 배열에서 데이터 가져 오기

웹 서비스는 보고서 작성기 2.0 보고서의 데이터 소스로 사용할 때 테스트되고 작동합니다. 웹 서비스에 XML SOAP 쿼리를 보내고 내 데이터가 포함 된 XML 결과를 가져올 수 있습니다.

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의 모습입니다 여기서

내가 DataSet[] 배열을 얻고있다 방법의 샘플입니다 웹 참조 :

[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[]를 반환,하지만 뭔가 웹 서비스, SomeCustomType에 사용되는 사용자 정의 유형이 아닌 그런 일이 일어나고 궁금 자동으로 생성 된 메서드에서 올바르게 변환되므로 빈 DataSet 개체가됩니다. 이 자동 생성 된 메서드를 편집하는 것을 주저합니다. 웹 서비스 코드에 액세스 할 수 있습니다. SomeCustomTypeDataSet[]으로 전송하려면 무엇인가해야합니까?

편집 : 웹 서비스에서 원시 XML SOAP 응답을받은 경우 더 잘할 수 있다고 생각합니다. DataSet[]으로 다시 돌아 오는 "번역 된"버전을 얻는 대신 어떻게해야합니까?

+0

Sysytem.Data.Dataset을 확인 했습니까? –

+0

@Henk : 웹 서비스 메소드의 반환 유형을 표시하기 위해 내 질문을 업데이트했습니다. –

+0

WebNethod의 (헤더)를 서버 측에 게시하면 도움이 될 수 있습니다. –

답변

1

내 프로젝트에서 웹 서비스 참조를 제거하고 대신 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; 
} 

내가 다음 반환 된 XmlDocument를 탐색하는 XPath 쿼리를 사용하고 내가 원하는 데이터, 내가 웹에서 다시받은 DataSet[]에 표시되지이었다 데이터를 얻을 수 내가 웹 참조를 사용할 때 서비스. 이미 IXmlSerializable을 구현 한 클래스가 있으므로 XPath로 반환 된 XML을 탐색 한 후에는 을 내 클래스의 ReadXml 메서드에 전달하고 클래스 인스턴스가 채워집니다.

관련 문제