Я пытаюсь составить SOAP-сообщение (включая заголовок) в С#.NET для отправки URL-адреса с помощью HTTP-сообщения. URL-адрес, который я хочу отправить, не является веб-сервисом, он просто получает сообщения SOAP, чтобы в конечном итоге извлечь из него информацию. Любые идеи о том, как это сделать?
Объект SOAP через HTTP-сообщение в С#.NET
Ответ 1
Сначала вам нужно создать допустимый XML. Я использую Linq для XML, чтобы добиться этого, например:
XNamespace soapenv = "http://schemas.xmlsoap.org/soap/envelope/";
var document = new XDocument(
new XDeclaration("1.0", "utf-8", String.Empty),
new XElement(soapenv + "Envelope",
new XAttribute(XNamespace.Xmlns + "soapenv", soapenv),
new XElement(soapenv + "Header",
new XElement(soapenv + "AnyOptionalHeader",
new XAttribute("AnyOptionalAttribute", "false"),
)
),
new XElement(soapenv + "Body",
new XElement(soapenv + "MyMethodName",
new XAttribute("AnyAttributeOrElement", "Whatever")
)
)
);
Затем я отправляю его с помощью (EDIT: добавлено XDocument.ToString()
здесь.)
var req = WebRequest.Create(uri);
req.Timeout = 300000; //timeout
req.Method = "POST";
req.ContentType = "text/xml;charset=UTF-8";
using (var writer = new StreamWriter(req.GetRequestStream()))
{
writer.WriteLine(document.ToString());
writer.Close();
}
Если мне нужно прочитать какой-то ответ, я делаю (это следующий код):
using (var rsp = req.GetResponse())
{
req.GetRequestStream().Close();
if (rsp != null)
{
using (var answerReader =
new StreamReader(rsp.GetResponseStream()))
{
var readString = answerReader.ReadToEnd();
//do whatever you want with it
}
}
}
Ответ 2
в вашем коде выше отсутствовала скобка и была дополнительная запятая, я исправил ее здесь:
XNamespace soapenv = "http://schemas.xmlsoap.org/soap/envelope/";
var document = new XDocument(
new XDeclaration("1.0", "utf-8", String.Empty),
new XElement(soapenv + "Envelope",
new XAttribute(XNamespace.Xmlns + "soapenv", soapenv),
new XElement(soapenv + "Header",
new XElement(soapenv + "AnyOptionalHeader",
new XAttribute("AnyOptionalAttribute", "false")
)
),
new XElement(soapenv + "Body",
new XElement(soapenv + "MyMethodName",
new XAttribute("AnyAttributeOrElement", "Whatever")
)
)
)
);