2009-08-11 5 views
1

C#에서 웹 서비스의 URL과 웹 메서드 이름을 사용하는 웹 서비스 클라이언트를 작성하고 있습니다..NET에서 웹 서비스를 동적으로 호출하는 방법

웹 메서드가 실제로 int를 받아서 DataTable을 반환하는지 확인하고 싶다면이 메서드를 호출하고 DataTable을 반환해야합니다.

동적으로 Proxy 클래스를 컴파일하는 게시물을 몇 개 발견했습니다.

하지만 클라이언트가 실제로 WSS 웹 파트이기 때문에 내 경우에 this'd가 너무 비싸고 페이지를 렌더링 할 때마다이 작업을 수행하고 싶지 않습니다. 속성이 변경 될 때만

답변

3

웹 서비스 설명은 XML 파일 일뿐입니다. 당신은 Service.asmx를 요청하여 그것을 잡을 수있는 WSDL : 당신이 서비스 설명을 일단

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://localhost:1753/Service1.asmx?WSDL"); 
HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8); 
string xml = reader.ReadToEnd(); 

당신이 그것을 구문 분석 및 방법 서명을 확인할 수 있습니다. 그런 다음 HTTP POST를 사용하여 메소드를 호출 할 수 있습니다.

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://localhost:1753/Service1.asmx?HelloWorld"); 
request.Method = "POST"; 
request.ContentType = "application/soap+xml; charset=utf-8"; 

byte[] data = Encoding.UTF8.GetBytes(
    @"<?xml version='1.0' encoding='utf-8'?> 
    <soap12:Envelope xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:soap12='http://www.w3.org/2003/05/soap-envelope'> 
    <soap12:Body> 
     <HelloWorld xmlns='http://tempuri.org/' /> 
    </soap12:Body> 
    </soap12:Envelope>"); 

request.ContentLength = data.Length; 
Stream requestStream = request.GetRequestStream(); 
requestStream.Write(data, 0, data.Length); 
requestStream.Close(); 
HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8); 
string xml = reader.ReadToEnd(); 
+0

Thks Pavel! 내가 그것에 들어가서 시도해라. ... 또한 WSDL을 vvalidate하는데 도움이 될 수 있다고 생각되는 ServiceDescription 객체에 대한 정보를 발견했다. –

1

웹 서비스가 항상 동일 할 경우 (즉, 메서드가 반환하는 것과 동일 함) 변경 될 수있는 URL 만 있으면 웹 파트가있는 프로젝트에 웹 참조를 추가하고, 프록시의 URL을 다음과 같이 설정하십시오.

using (var serviceProxy = new ServiceProxy()) 
{ 
    serviceProxy.Url = somepropertysetbythewebpart; 
    // make call to method here 
} 
+0

사실 ... 내가 HTTP를 가리키는 수 있습니다 변경할 수 있습니다 두 가지 : 여기

은 전체 코드는 한 페이지에 //someurl/someservice.asmx하지만, 또 다른이는 HTTP 수를 : //someurl/anotherservice.asmx이며, 호출되는 메소드의 이름도 변경 될 수 있습니다. –

0

많은 재구성 작업을 수행 한 후이를 수행하는 방법을 발견했습니다. 선택한 답변의 코드가 거의 있지만, 머리글에 SOAPAction을 추가하고 ContentType을 변경해야했습니다.

var strRequest = @"<soap12:Envelope> 
        ... 
        </soap12:Envelope>"; 

string webServiceUrl = "http://localhost:8080/AccontService.svc"; 
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(webServiceUrl); 

request.Method = "POST"; 
request.ContentType = "text/xml;charset=UTF-8";   
request.Accept = "text/xml"; 
request.Headers.Add("SOAPAction", "http://tempuri.org/IAccountService/UpdateAccount"); 

byte[] data = Encoding.UTF8.GetBytes(strRequest); 

request.ContentLength = data.Length; 
Stream requestStream = request.GetRequestStream(); 
requestStream.Write(data, 0, data.Length); 
requestStream.Close(); 

HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8); 
string responseXmlString = reader.ReadToEnd(); 

return new HttpResponseMessage() 
{ 
    Content = new StringContent(responseXmlString, Encoding.UTF8, "application/xml") 
}; 
관련 문제