Программный вызов webmethods на языке C#


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

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

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 5

2 ответа:

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

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

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

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

К вашему сведению, в вашем коде отсутствуют блоки 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());
        }    
    }
}