Вопрос

Я пытаюсь составить SOAP-сообщение (включая заголовок) на C # .NET для отправки на URL-адрес с использованием HTTP post.URL, на который я хочу его отправить, не является веб-сервисом, он просто получает SOAP-сообщения, чтобы в конечном итоге извлечь из них информацию.Есть какие-нибудь идеи о том, как это сделать?

Это было полезно?

Решение

Сначала вам нужно создать допустимый XML-файл.Я использую Linq to 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")
                       )
                   )
                );

Затем я отправляю его с помощью (Редактировать:добавленный 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
                    }
                }
            }

Другие советы

в вашем приведенном выше коде отсутствовала скобка и была лишняя запятая, я исправил это здесь:

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") 
            ) 
        ) 
    )
); 
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top