Программно вызвать веб-методы в C # - PullRequest
5 голосов
/ 04 июня 2010

Я пытаюсь написать функцию, которая может вызывать веб-метод с веб-сайта с учетом имени метода и URL-адреса веб-службы. Я нашел код в блоге, который прекрасно справляется с этой задачей, за исключением одной детали. Требуется также предоставить XML-запрос. Цель здесь - получить шаблон XML запроса от самого веб-сервиса. Я уверен, что это как-то возможно, потому что я могу видеть шаблоны XML запроса и ответа, если я получаю доступ к URL-адресу веб-службы в своем браузере.

Это код, который вызывает веб-метод программно:

XmlDocument doc = new XmlDocument();
//this is the problem. I need to get this automatically
doc.Load("../../request.xml"); 
HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://localhost/dummyws/dummyws.asmx?op=HelloWorld");
req.ContentType = "text/xml;charset=\"utf-8\"";
req.Accept = "text/xml";
req.Method = "POST";
Stream stm = req.GetRequestStream();
doc.Save(stm);
stm.Close();
WebResponse resp = req.GetResponse();
stm = resp.GetResponseStream();
StreamReader r = new StreamReader(stm);
Console.WriteLine(r.ReadToEnd());

Ответы [ 2 ]

2 голосов
/ 04 июня 2010

В соответствии с комментариями выше. Если у вас есть файл WSDL, описывающий вашу службу, вы используете его как информацию, необходимую для связи с вашей веб-службой.

Использование прокси-класса для взаимодействия с прокси-сервером службы - это простой способ абстрагироваться от основных параметров HTTP и XML.

Есть способы сделать это во время выполнения - по сути, генерировать код, который генерирует Visual Studio, когда вы добавляете ссылку на веб-сервис в ваш проект.

Я использовал решение, основанное на: этом вопросе группы новостей , но есть также других примеров .

0 голосов
/ 09 июня 2010

К вашему сведению, в вашем коде отсутствуют блоки using. Это должно быть больше так:

XmlDocument doc = new XmlDocument();
//this is the problem. I need to get this automatically
doc.Load("../../request.xml"); 
HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://localhost/dummyws/dummyws.asmx?op=HelloWorld");
req.ContentType = "text/xml;charset=\"utf-8\"";
req.Accept = "text/xml";
req.Method = "POST";

using (Stream reqstm = req.GetRequestStream())
{
    doc.Save(reqstm);
}

using (WebResponse resp = req.GetResponse())
{
    using (Stream respstm = resp.GetResponseStream())
    {
        using (StreamReader r = new StreamReader(respstm))
        {
            Console.WriteLine(r.ReadToEnd());
        }    
    }
}
...