Вызов метода веб-службы ASP.NET через запрос http - PullRequest
2 голосов
/ 22 октября 2009

Я хочу вызвать веб-службу ASP.NET через запрос POST http с использованием C # (т.е. я не хочу использовать объект SoapHttpClientProtocol, созданный при запуске wsdl.exe).

Насколько я могу судить, процесс включает в себя:

  1. создание объекта HttpWebRequest, который указывает на URL / метод веб-службы, с методом;

  2. Создание конверта SOAP xml;

  3. Сериализация любых параметров, которые я хочу передать в веб-метод с использованием XmlSerializer;

  4. Выполнение запроса и разбор ответа.

Я хотел бы сделать это без необходимости копировать и использовать сгенерированный код.

(1) кажется довольно простым;

(2) Я не знаю, является ли конверт стандартным или как он должен меняться в зависимости от метода веб-сервиса, который я вызываю. Наверное, мне может понадобиться добавить пользовательские заголовки мыла, если этого требует служба?

(3) Как происходит это? Я предполагаю, что мне нужно сделать что-то вроде этого:

MyClass myObj;
XmlSerializer ser = new XmlSerializer(myObj.GetType());
TextWriter writer = new StringWriter();
ser.Serialize(writer, myObj);
string soapXml = writer.ToString();
writer.Close();

Кроме того, я думаю, что я должен добавить soapXml к soap: Body body

(4) Я считаю, что я должен извлечь и десериализовать содержимое мыла: элемент тела, а также. Можно ли использовать обратную процедуру в (3)?

Спасибо

* +1037 * * К. +1038 *

1 Ответ

8 голосов
/ 22 октября 2009

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

Предположим, у вас была следующая служба SOAP:

public class Foo
{
    public int Id { get; set; }
    public string Name { get; set; }
}

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class Service1 : System.Web.Services.WebService
{
    [WebMethod]
    public string HelloWorld(Foo foo)
    {
        return "Hello World";
    }
}

Вы можете вызвать его вручную следующим образом:

class Program
{
    static void Main(string[] args)
    {
        using (WebClient client = new WebClient())
        {
            client.Headers.Add("SOAPAction", "\"http://tempuri.org/HelloWorld\"");
            client.Headers.Add("Content-Type", "text/xml; charset=utf-8");
            var payload = @"<?xml version=""1.0"" encoding=""utf-8""?><soap:Envelope xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/"" xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema""><soap:Body><HelloWorld xmlns=""http://tempuri.org/""><foo><Id>1</Id><Name>Bar</Name></foo></HelloWorld></soap:Body></soap:Envelope>";
            var data = Encoding.UTF8.GetBytes(payload);
            var result = client.UploadData("http://localhost:1475/Service1.asmx", data);
            Console.WriteLine(Encoding.Default.GetString(result));
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...