Search code examples
c#.netsoaphttp-postenvelope

SOAP object over HTTP post in C# .NET


I am trying to compose a SOAP message(including header) in C# .NET to send to a URL using HTTP post. The URL I want to send it to is not a web-service, it just receives SOAP messages to eventually extract information from it. Any ideas on how to do this?


Solution

  • First you need to create a valid XML. I use Linq to XML to achieve this, like follow:

    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")
                           )
                       )
                    );
    

    Then I send it using (EDIT: added XDocument.ToString() down here.)

                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();
                }
    

    If I have to read some response, I do (this is followup of the above code):

                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
                        }
                    }
                }