|
|
@@ -0,0 +1,232 @@
|
|
|
+using System;
|
|
|
+using System.Collections;
|
|
|
+using System.Collections.Generic;
|
|
|
+using System.Dynamic;
|
|
|
+using System.IO;
|
|
|
+using System.Linq;
|
|
|
+using System.Net;
|
|
|
+using System.Text;
|
|
|
+using System.Threading.Tasks;
|
|
|
+using System.Web;
|
|
|
+using System.Xml;
|
|
|
+using System.Xml.Serialization;
|
|
|
+
|
|
|
+/// <summary>
|
|
|
+/// WebService接口调用通用方法 xuwei 2020-07-02
|
|
|
+/// </summary>
|
|
|
+namespace DK.XuWei.WebMes
|
|
|
+{
|
|
|
+ public static class XmlClient
|
|
|
+ {
|
|
|
+ //<webServices>
|
|
|
+ // <protocols>
|
|
|
+ // <add name="HttpGet"/>
|
|
|
+ // <add name="HttpPost"/>
|
|
|
+ // <add name="HttpSoap"/>
|
|
|
+ // </protocols>
|
|
|
+ //</webServices>
|
|
|
+
|
|
|
+ private static Hashtable _xmlNamespaces = new Hashtable();//缓存xmlNamespace,避免重复调用GetNamespace
|
|
|
+
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// HttpPost方式调用WebService
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="URL">地址</param>
|
|
|
+ /// <param name="MethodName">方法名</param>
|
|
|
+ /// <param name="Pars">参数集合</param>
|
|
|
+ /// <returns></returns>
|
|
|
+ public static XmlDocument Post(String URL, String MethodName, Hashtable Pars, NetworkCredential credentials = null)
|
|
|
+ {
|
|
|
+ HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(URL + "/" + MethodName);
|
|
|
+ request.Method = "POST";
|
|
|
+ request.ContentType = "application/x-www-form-urlencoded;charset=utf-8";
|
|
|
+ if (credentials != null)
|
|
|
+ request.Credentials = credentials;
|
|
|
+ else
|
|
|
+ request.Credentials = CredentialCache.DefaultCredentials;
|
|
|
+ request.Timeout = 1000 * 30;
|
|
|
+ //SetWebRequest(request);
|
|
|
+ byte[] data = EncodePars(Pars);
|
|
|
+ WriteRequestData(request, data);
|
|
|
+ return ReadXmlResponse(request.GetResponse());
|
|
|
+ }
|
|
|
+
|
|
|
+ public static XmlDocument Post(String URL, String Str, NetworkCredential credentials = null)
|
|
|
+ {
|
|
|
+ HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(URL);
|
|
|
+ request.Method = "POST";
|
|
|
+ request.ContentType = "application/x-www-form-urlencoded;charset=utf-8";
|
|
|
+ if (credentials != null)
|
|
|
+ request.Credentials = credentials;
|
|
|
+ else
|
|
|
+ request.Credentials = CredentialCache.DefaultCredentials;
|
|
|
+ request.Timeout = 1000 * 30;
|
|
|
+ //SetWebRequest(request);
|
|
|
+ byte[] data = EncodePars(Str);
|
|
|
+ WriteRequestData(request, data);
|
|
|
+ return ReadXmlResponse(request.GetResponse());
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// HttpGet方式调用WebService
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="URL">地址</param>
|
|
|
+ /// <param name="MethodName">方法名</param>
|
|
|
+ /// <param name="Pars">参数集合</param>
|
|
|
+ /// <returns></returns>
|
|
|
+ public static XmlDocument Get(String URL, String MethodName, Hashtable Pars)
|
|
|
+ {
|
|
|
+ string temp = URL + "/" + MethodName + "?" + ParsToString(Pars);
|
|
|
+ HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(URL + "/" + MethodName + "?" + ParsToString(Pars));
|
|
|
+ request.Method = "GET";
|
|
|
+ request.ContentType = "application/x-www-form-urlencoded;charset=utf-8";
|
|
|
+ SetWebRequest(request);
|
|
|
+ return ReadXmlResponse(request.GetResponse());
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// Soap方式调用WebService
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="URL">地址</param>
|
|
|
+ /// <param name="MethodName">方法名</param>
|
|
|
+ /// <param name="Pars">参数集合</param>
|
|
|
+ /// <returns></returns>
|
|
|
+ public static XmlDocument Soap(String URL, String MethodName, Hashtable Pars)
|
|
|
+ {
|
|
|
+ if (_xmlNamespaces.ContainsKey(URL))
|
|
|
+ {
|
|
|
+ return QuerySoapWebService(URL, MethodName, Pars, _xmlNamespaces[URL].ToString());
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ return QuerySoapWebService(URL, MethodName, Pars, GetNamespace(URL));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private static XmlDocument QuerySoapWebService(String URL, String MethodName, Hashtable Pars, string XmlNs)
|
|
|
+ {
|
|
|
+ _xmlNamespaces[URL] = XmlNs;//加入缓存,提高效率
|
|
|
+ HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(URL);
|
|
|
+ request.Method = "POST";
|
|
|
+ request.ContentType = "text/xml; charset=utf-8";
|
|
|
+ request.Headers.Add("SOAPAction", "\"" + XmlNs + (XmlNs.EndsWith("/") ? "" : "/") + MethodName + "\"");
|
|
|
+ SetWebRequest(request);
|
|
|
+ byte[] data = EncodeParsToSoap(Pars, XmlNs, MethodName);
|
|
|
+ WriteRequestData(request, data);
|
|
|
+ XmlDocument doc = new XmlDocument(), doc2 = new XmlDocument();
|
|
|
+ doc = ReadXmlResponse(request.GetResponse());
|
|
|
+
|
|
|
+ XmlNamespaceManager mgr = new XmlNamespaceManager(doc.NameTable);
|
|
|
+ mgr.AddNamespace("soap", "http://schemas.xmlsoap.org/soap/envelope/");
|
|
|
+ String RetXml = doc.SelectSingleNode("//soap:Body/*/*", mgr).InnerXml;
|
|
|
+ doc2.LoadXml("<root>" + RetXml + "</root>");
|
|
|
+ AddDelaration(doc2);
|
|
|
+ return doc2;
|
|
|
+ }
|
|
|
+ private static string GetNamespace(String URL)
|
|
|
+ {
|
|
|
+ HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL + "?WSDL");
|
|
|
+ SetWebRequest(request);
|
|
|
+ WebResponse response = request.GetResponse();
|
|
|
+ StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
|
|
|
+ XmlDocument doc = new XmlDocument();
|
|
|
+ doc.LoadXml(sr.ReadToEnd());
|
|
|
+ sr.Close();
|
|
|
+ return doc.SelectSingleNode("//@targetNamespace").Value;
|
|
|
+ }
|
|
|
+ private static byte[] EncodeParsToSoap(Hashtable Pars, String XmlNs, String MethodName)
|
|
|
+ {
|
|
|
+ XmlDocument doc = new XmlDocument();
|
|
|
+ doc.LoadXml("<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/\"></soap:Envelope>");
|
|
|
+ AddDelaration(doc);
|
|
|
+ XmlElement soapBody = doc.CreateElement("soap", "Body", "http://schemas.xmlsoap.org/soap/envelope/");
|
|
|
+ XmlElement soapMethod = doc.CreateElement(MethodName);
|
|
|
+ soapMethod.SetAttribute("xmlns", XmlNs);
|
|
|
+ foreach (string k in Pars.Keys)
|
|
|
+ {
|
|
|
+ XmlElement soapPar = doc.CreateElement(k);
|
|
|
+ soapPar.InnerXml = ObjectToSoapXml(Pars[k]);
|
|
|
+ soapMethod.AppendChild(soapPar);
|
|
|
+ }
|
|
|
+ soapBody.AppendChild(soapMethod);
|
|
|
+ doc.DocumentElement.AppendChild(soapBody);
|
|
|
+ return Encoding.UTF8.GetBytes(doc.OuterXml);
|
|
|
+ }
|
|
|
+ private static string ObjectToSoapXml(object o)
|
|
|
+ {
|
|
|
+ XmlSerializer mySerializer = new XmlSerializer(o.GetType());
|
|
|
+ MemoryStream ms = new MemoryStream();
|
|
|
+ mySerializer.Serialize(ms, o);
|
|
|
+ XmlDocument doc = new XmlDocument();
|
|
|
+ doc.LoadXml(Encoding.UTF8.GetString(ms.ToArray()));
|
|
|
+ if (doc.DocumentElement != null)
|
|
|
+ {
|
|
|
+ return doc.DocumentElement.InnerXml;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ return o.ToString();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ private static void SetWebRequest(HttpWebRequest request)
|
|
|
+ {
|
|
|
+ request.Credentials = CredentialCache.DefaultCredentials;
|
|
|
+ request.Timeout = 10000;
|
|
|
+ }
|
|
|
+
|
|
|
+ private static void WriteRequestData(HttpWebRequest request, byte[] data)
|
|
|
+ {
|
|
|
+ request.ContentLength = data.Length;
|
|
|
+ Stream writer = request.GetRequestStream();
|
|
|
+ writer.Write(data, 0, data.Length);
|
|
|
+ writer.Close();
|
|
|
+ }
|
|
|
+
|
|
|
+ private static byte[] EncodePars(Hashtable Pars)
|
|
|
+ {
|
|
|
+ //return Encoding.UTF8.GetBytes(ParsToString(Pars));
|
|
|
+ return System.Text.Encoding.GetEncoding("UTF-8").GetBytes(ParsToString(Pars));
|
|
|
+ }
|
|
|
+
|
|
|
+ private static byte[] EncodePars(string Str)
|
|
|
+ {
|
|
|
+ //return Encoding.UTF8.GetBytes(ParsToString(Pars));
|
|
|
+ return System.Text.Encoding.GetEncoding("UTF-8").GetBytes(Str);
|
|
|
+ }
|
|
|
+
|
|
|
+ private static String ParsToString(Hashtable Pars)
|
|
|
+ {
|
|
|
+ StringBuilder sb = new StringBuilder();
|
|
|
+ foreach (string k in Pars.Keys)
|
|
|
+ {
|
|
|
+ if (sb.Length > 0)
|
|
|
+ {
|
|
|
+ sb.Append("&");
|
|
|
+ }
|
|
|
+ sb.Append(HttpUtility.UrlEncode(k) + "=" + HttpUtility.UrlEncode(Pars[k].ToString()));
|
|
|
+ }
|
|
|
+ return sb.ToString();
|
|
|
+ }
|
|
|
+
|
|
|
+ private static XmlDocument ReadXmlResponse(WebResponse response)
|
|
|
+ {
|
|
|
+ StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
|
|
|
+ String retXml = sr.ReadToEnd();
|
|
|
+ sr.Close();
|
|
|
+ XmlDocument doc = new XmlDocument();
|
|
|
+ doc.LoadXml(retXml);
|
|
|
+ return doc;
|
|
|
+ }
|
|
|
+
|
|
|
+ private static void AddDelaration(XmlDocument doc)
|
|
|
+ {
|
|
|
+ XmlDeclaration decl = doc.CreateXmlDeclaration("1.0", "utf-8", null);
|
|
|
+ doc.InsertBefore(decl, doc.DocumentElement);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
+
|