Как программно отправить информацию в веб-сервис в C # с .NET? - PullRequest
7 голосов
/ 30 декабря 2010

Я знаю, что этот вид считается изобретением колеса, но мне нужно знать, чтобы общаться с веб-сервисом через http / soap / xml и веб-сообщения.Причина в том, что мне нужно связаться со сторонним веб-сервисом для работы, но что-то не так с WSDL или чем-то другим, и он не работает при подключении к нему с помощью мастера .NET.

Итак, могукто-нибудь даст мне процесс / простой пример / и т.д.о том, как это сделать, или кто-нибудь может дать мне ссылку на то, где это объясняет?Я не очень разбираюсь в веб-запросах и ответах.

Как создать и отправить запрос?Как мне разобрать ответ?

Вот код простого веб-сервиса.Притворимся, что адрес .asmx: "http://www.mwebb.com/TestSimpleService.asmx":

using System;
using System.Data;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;

namespace TestSimpleService
{
    [WebService]
    public class Soap : System.Web.Services.WebService
    {
        [WebMethod]
        public string SayHello(string name)
        {
            return "Hello " + name + "!";
        }
    }
}

Как бы я назвал этот метод?

Любая помощь приветствуется.

РЕДАКТИРОВАТЬ

Я просто хочу знать, как отправить данные в веб-сервис. Я могу получить все данные метода / действия SOAP / URL и проанализировать данные ответа. Я просто не знаю, какие объектыиспользовать или как их использовать.

Если кто-нибудь знает несколько простых мыльных клиентов .NET, таких как SUDS в Python, это тоже поможет.

Ответы [ 4 ]

7 голосов
/ 30 декабря 2010

Если вы хотите общаться напрямую, я бы хотел использовать HTTPWebRequest, поскольку в конечном счете вызов веб-службы - это просто XML, отправляемый с помощью HTTP POST.

Следующая ссылка содержит несколько примеров: http://geekswithblogs.net/marcel/archive/2007/03/26/109886.aspx

В качестве способа тестирования внешнего веб-сервиса перед его программным подключением к .net одним из способов является использование инструмента тестирования, такого как SOAPUI , для создания точного XML-файла, который, по вашему мнению, необходимо опубликовать в веб-сервисе отправить его вручную с помощью этого инструмента

Тогда вы можете разработать .net эквивалент

РЕДАКТИРОВАТЬ - вот быстрый пример, который я набрал, чтобы вызвать ваш пример сервиса (используя SOAP1.2) на основе ссылки выше:

        {
            string soap = @"<?xml version=""1.0"" encoding=""utf-8""?>
<soap:Envelope xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" 
   xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" 
   xmlns:soap=""http://www.w3.org/2003/05/soap-envelope"">
  <soap:Body>
    <SayHello xmlns=""http://tempuri.org/"">
      <name>My Name Here</name>
    </SayHello>
  </soap:Body>
</soap:Envelope>";

            HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://localhost:2439/Soap.asmx");
            req.ContentType = "application/soap+xml;";
            req.Method = "POST";

            using (Stream stm = req.GetRequestStream())
            {
                using (StreamWriter stmw = new StreamWriter(stm))
                {
                    stmw.Write(soap);
                }
            }

            WebResponse response = req.GetResponse(); 
            Stream responseStream = response.GetResponseStream();

            // Do whatever you need with the response
            Byte[] myData = ReadFully(responseStream);
            string s = System.Text.ASCIIEncoding.ASCII.GetString(myData);
        }

Метод ReadFully происходит от http://www.yoda.arachsys.com/csharp/readbinary.html и выглядит так, как будто он произошел от Джона Скита.

1 голос
/ 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")
};
0 голосов
/ 30 декабря 2010

Если ваша служба действительно такая же простая, как ваш пример, просто используйте «Добавить ссылку на службу» и используйте прокси.

Если это не сработает, то используйте программу командной строки svcutil.exeи публиковать сообщения об ошибках, которые он печатает.

Не используйте WSDL.EXE, если у вас нет выбора.

0 голосов
/ 30 декабря 2010

Существует XML-RPC.NET , который позволяет создавать привязки на лету.

например. (пример с их сайта):

[XmlRpcUrl("http://betty.userland.com/RPC2")]
public interface IStateName : IXmlRpcProxy
{
    [XmlRpcMethod("examples.getStateName")]
    string GetStateName(int stateNumber); 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...