【问题标题】:C# SOAP Service without WCF没有 WCF 的 C# SOAP 服务
【发布时间】:2013-08-30 14:58:03
【问题描述】:

我正在尝试在 C# 中创建 SOAP Web 服务和 Web 客户端不使用 WCF 工具。我的目标是创建一个与很可能不使用 WCF 的 SOAP 服务进行通信的客户端。 我制作了一个概念验证客户端,但目前我不确定如何编写原始 SOAP XML 以发送到 WCF 服务来测试我的客户端。 另外,我可以在客户端即使 SOAP 服务不使用 WCF?谢谢!

SOAP 客户端:

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 服务:

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

【问题讨论】:

    标签: c# asp.net wcf web-services soap


    【解决方案1】:

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

    【讨论】:

    • 所以我真正需要的 WCF 服务只是修改 web.config / package.config? <basicHttpBinding>
    • 请注意 basicHttpBinding 是 SOAP 1.1(这是 OP 似乎需要的)。如果是 SOAP 1.2,他们可以使用 wsHttpBinding。
    猜你喜欢
    • 1970-01-01
    • 2018-12-29
    • 1970-01-01
    • 1970-01-01
    • 2014-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多