3

I'm trying to create a SOAP web service and web client in C# without using the WCF tools. My objective is to create a client that communicates with a SOAP service that most likely is not using WCF. 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. Also, can I use WCF on the client side even if the SOAP service does not use WCF? Thanks!

SOAP Client:

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 = "<?xml version=\"1.0\" encoding=\"utf-8\"?>";
            xml += "<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/\">";
            xml += "<soap:Body>";
            xml += "<CelsiusToFahrenheit xmlns=\"http://tempuri.org/\">";
            xml += "<Celsius>20</Celsius>";
            xml += "</CelsiusToFahrenheit>";
            xml += "</soap:Body>";
            xml += "</soap:Envelope>";
            soapEnvelop.LoadXml(xml);
            return soapEnvelop;
        }

        private static void InsertSoapEnvelopeIntoWebRequest(XmlDocument soapEnvelopeXml, HttpWebRequest webRequest)
        {
            using (Stream stream = webRequest.GetRequestStream())
            {
                soapEnvelopeXml.Save(stream);
            }
        }
    }
}

SOAP Service:

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" }
            };
        }
    }
}
4

1 回答 1

3

您可以将 WCF 与 basicHttpBinding 一起使用。这将创建一个可由非 WCF 客户端互操作的 SOAP 服务。

于 2013-08-30T15:04:19.617 回答