title: C# SOAP Service without WCF
body: <p>I'm trying to create a SOAP web service and web client in C# <strong><em>without using the WCF tools</em></strong>.  My objective is to create a client that communicates with a SOAP service that most likely is not using WCF.  <em>I made a proof of concept client, but at the moment I'm not really sure how to write the raw SOAP XML to send to the WCF service to test my client.</em>  Also, can I use WCF on the client side even if the SOAP service does not use WCF?  Thanks!</p>
  
  <p><strong>SOAP Client:</strong></p>
  
  <pre><code>using System;
  using System.Collections.Generic;
  using System.Linq;
  using System.Web;
  using System.Xml;
  using System.Net;
  using System.Text;
  using System.IO;
  
  namespace HttpSoapPoc.Models
  {
      public class SoapClient
      {
          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; }
          }
  
          public static string CallWebService()
          {
              var _url = "https://passport.iso.com/PPWebListener/services/SOAPListenerV2";
              var _action = "https://passport.iso.com/PPWebListener/services/SOAPListenerV2?op=HelloWorld";
  
              XmlDocument soapEnvelopeXml = CreateSoapEnvelope();
              HttpWebRequest webRequest = CreateWebRequest(_url, _action);
              InsertSoapEnvelopeIntoWebRequest(soapEnvelopeXml, webRequest);
  
              // begin async call to web request.
              IAsyncResult asyncResult = webRequest.BeginGetResponse(null, null);
  
              // suspend this thread until call is complete. You might want to
              // do something usefull here like update your UI.
              asyncResult.AsyncWaitHandle.WaitOne();
  
              // get the response from the completed web request.
              string soapResult;
              using (WebResponse webResponse = webRequest.EndGetResponse(asyncResult))
              {
                  using (StreamReader rd = new StreamReader(webResponse.GetResponseStream()))
                  {
                      soapResult = rd.ReadToEnd();
                  }
                  return soapResult;
              }
  
          }
  
          private static HttpWebRequest CreateWebRequest(string url, string action)
          {
              HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url);
              webRequest.Headers.Add("SOAPAction", action);
              webRequest.ContentType = "text/xml;charset=\"utf-8\"";
              webRequest.Accept = "text/xml";
              webRequest.Method = "POST";
              return webRequest;
          }
  
          private static XmlDocument CreateSoapEnvelope()
          {
              XmlDocument soapEnvelop = new XmlDocument();
              String xml = "&lt;?xml version=\"1.0\" encoding=\"utf-8\"?&gt;";
              xml += "&lt;soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\"&gt;";
              xml += "&lt;soap:Body&gt;";
              xml += "&lt;CelsiusToFahrenheit xmlns=\"http://tempuri.org/\"&gt;";
              xml += "&lt;Celsius&gt;20&lt;/Celsius&gt;";
              xml += "&lt;/CelsiusToFahrenheit&gt;";
              xml += "&lt;/soap:Body&gt;";
              xml += "&lt;/soap:Envelope&gt;";
              soapEnvelop.LoadXml(xml);
              return soapEnvelop;
          }
  
          private static void InsertSoapEnvelopeIntoWebRequest(XmlDocument soapEnvelopeXml, HttpWebRequest webRequest)
          {
              using (Stream stream = webRequest.GetRequestStream())
              {
                  soapEnvelopeXml.Save(stream);
              }
          }
      }
  }
  </code></pre>
  
  <p><strong>SOAP Service:</strong></p>
  
  <pre><code>using System;
  using System.Collections.Generic;
  using System.Linq;
  using System.Runtime.Serialization;
  using System.ServiceModel;
  using System.ServiceModel.Web;
  using System.Text;
  using System.ServiceModel.Activation;
  
  namespace SoapTutorial
  {
      [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
      public class SoapService : ISoapService
      {
          public Employee[] GetEmployees()
          {
              return new Employee[]
              {
                  new Employee() { EmpNo=101, EmpName="Mahesh", DeptName="CTD" },
                  new Employee() { EmpNo=102, EmpName="Akash", DeptName="HRD" }
              };
          }
      }
  }
  </code></pre>