Как динамически вызывать веб-сервисы в .Net - PullRequest
1 голос
/ 11 августа 2009

Я пишу клиент веб-службы на C #, который берет URL-адрес веб-службы и имя веб-метода.

Я хочу проверить, действительно ли веб-метод w получает int и возвращает DataTable, и если это так, он должен вызвать его и вернуть DataTable.

Я нашел пару постов, в которых это достигается динамической компиляцией класса Proxy.

Но для моего случая это было бы слишком дорого, потому что клиент на самом деле является веб-частью WSS, и я не хочу делать это каждый раз, когда страница отображается; только когда свойства изменены.

Ответы [ 3 ]

3 голосов
/ 12 августа 2009

В конце дня описание веб-службы - это просто файл 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();
1 голос
/ 11 августа 2009

Если веб-служба всегда одна и та же (т. Е. Метод совпадает с тем, что она возвращает), а uit - это просто URL-адрес, который может измениться, просто добавьте веб-ссылку на проект с веб-частью в нем, установите URL прокси так:

using (var serviceProxy = new ServiceProxy())
{
  serviceProxy.Url = somepropertysetbythewebpart;
  // make call to method here
}
0 голосов
/ 23 января 2016

После долгих поисков я узнал, как это сделать. Код выбранного ответа почти у цели, но мне пришлось добавить 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")
};
...