基于 SOAP消息协议的 HttpWebRequest 请求 WebService 服务接口

 

private const string Request_UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36";

public static string QuerySoapWebService(string url, string methodName, Hashtable pars)
        {
            url = url.Contains("?WSDL") || url.Contains("?wsdl") ? url : url + "?WSDL";

            var request = (HttpWebRequest)WebRequest.Create(url);
            request.Method      = "POST";
            request.ContentType = "text/xml; charset=utf-8";
            request.UserAgent   = Request_UserAgent;

            //request.Headers.Add("SOAPAction", "\"" + XmlNs + (XmlNs.EndsWith("/") ? "" : "/") + methodName + "\"");
            //SetWebRequest(request);

            var data = SoapWebServiceEncodeParsToSoap(pars, methodName);
            request.ContentLength = data.Length;

            var writer = request.GetRequestStream();
            writer.Write(data, 0, data.Length);
            writer.Close();

            var sr     = new StreamReader(request.GetResponse().GetResponseStream(), Encoding.UTF8);
            var retXml = sr.ReadToEnd();
            sr.Close();
            return retXml;
        }

        private static byte[] SoapWebServiceEncodeParsToSoap(Hashtable pars, string methodName)
        {
            string str = "<?xml version=\"1.0\" encoding=\"utf-8\"?>";
            str += "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:tem=\"http://tempuri.org/\">";
            str += "   <soapenv:Header>";
            str += "      <Authorization>Basic " + pars["Authorization"] + "</Authorization>";//网关授权token,没有可不加
            str += "      <tem:Header>";//不需要登录,可不加
            str += "         <tem:UserName>" + pars["UserName"] + "</tem:UserName>";
            str += "         <tem:PassWord>" + pars["PassWord"] + "</tem:PassWord>";
            str += "      </tem:Header>";
            str += "   </soapenv:Header>";
            str += "   <soapenv:Body>";
            str += "      <tem:" + methodName + ">";
            foreach (string item in pars.Keys)
            {
                str += "<tem:" + item + ">" + pars[item] + "</tem:" + item + ">";
            }
            str += "      </tem:" + methodName + ">";
            str += "   </soapenv:Body>";
            str += "</soapenv:Envelope>";

            return Encoding.UTF8.GetBytes(str);
        }