Отправка и получение сообщений SOAP - PullRequest
7 голосов
/ 08 декабря 2009

Я пишу клиент веб-службы на C # и не хочу создавать и сериализовывать / десериализовывать объекты, а скорее отправлять и получать необработанный XML.

Возможно ли это в C #?

Ответы [ 4 ]

4 голосов
/ 17 августа 2010

Вот часть реализации, которую я только что запустил на основе примера Джона М. Ганта. Важно установить заголовок запроса типа контента. Плюс к моему запросу нужны учетные данные.

protected virtual WebRequest CreateRequest(ISoapMessage soapMessage)
{
    var wr = WebRequest.Create(soapMessage.Uri);
    wr.ContentType = "text/xml;charset=utf-8";
    wr.ContentLength = soapMessage.ContentXml.Length;

    wr.Headers.Add("SOAPAction", soapMessage.SoapAction);
    wr.Credentials = soapMessage.Credentials;
    wr.Method = "POST";
    wr.GetRequestStream().Write(Encoding.UTF8.GetBytes(soapMessage.ContentXml), 0, soapMessage.ContentXml.Length);

    return wr;
}

public interface ISoapMessage
{
    string Uri { get; }
    string ContentXml { get; }
    string SoapAction { get; }
    ICredentials Credentials { get; }
}
3 голосов
/ 08 декабря 2009

Вы можете использовать классы System.Net, такие как HttpWebRequest и HttpWebResponse, для чтения и записи непосредственно в соединение HTTP.

Вот базовый (не собранные, не скомпилированные, не проверяющий ошибки, сильно упрощенный) пример. Может быть не на 100% правильно, но, по крайней мере, даст вам представление о том, как это работает:

HttpWebRequest req = (HttpWebRequest) HttpWebRequest.Create(url);
req.ContentLength = content.Length;
req.Method = "POST";
req.GetRequestStream().Write(Encoding.ASCII.GetBytes(content), 0, content.Length);
HttpWebResponse resp = (HttpWebResponse) req.getResponse();
//Read resp.GetResponseStream() and do something with it...

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

2 голосов
/ 08 декабря 2009

Да - вы можете просто объявить входы и выходы как XmlNode s

[WebMethod]
public XmlNode MyMethod(XmlNode input);
1 голос
/ 08 декабря 2009

Вы можете заставить свой метод веб-сервиса возвращать строку, содержащую xml, но прислушайтесь к приведенному выше комментарию о том, как сделать вещи более подверженными ошибкам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...