123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195 |
- using System;
- using System.Web;
- using System.Xml;
- using System.Collections;
- using System.Net;
- using System.Text;
- using System.IO;
- using System.Xml.Serialization;
- /// <summary>
- /// 利用WebRequest/WebResponse进行WebService调用的类
- /// </summary>
- public class WebSvcCaller
- {
- //<webServices>
- // <protocols>
- // <add name="HttpGet"/>
- // <add name="HttpPost"/>
- // </protocols>
- //</webServices>
- private static Hashtable _xmlNamespaces = new Hashtable();//缓存xmlNamespace,避免重复调用GetNamespace
- public static CookieContainer cc = new CookieContainer();
- /// <summary>
- /// 需要WebService支持Post调用
- /// </summary>
- public static string QueryPostWebService(String URL, String MethodName, Hashtable Pars)
- {
- HttpWebResponse response = null;
- string html = "";
- HttpWebRequest request = null;
- Pars.Add("roundnum", Guid.NewGuid());
- try
- {
- request = (HttpWebRequest)HttpWebRequest.Create(URL + "/" + MethodName);
- request.Method = "POST";
- request.ContentType = "application/x-www-form-urlencoded";
- request.CookieContainer = cc;
- SetWebRequest(request);
- byte[] data = EncodePars(Pars);
- WriteRequestData(request, data);
- response = (HttpWebResponse)request.GetResponse();
- }
- catch (WebException e)
- {
- response = e.Response as HttpWebResponse;
- }
- if (response != null)
- {
- response.Cookies = request.CookieContainer.GetCookies(request.RequestUri);
- StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
- html = sr.ReadToEnd();
- }
- return html;
- }
- /// <summary>
- /// 需要WebService支持Get调用
- /// </summary>
- public static XmlDocument QueryGetWebService(String URL, String MethodName, Hashtable Pars)
- {
- HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(URL + "/" + MethodName + "?" + ParsToString(Pars));
- request.Method = "GET";
- request.ContentType = "application/x-www-form-urlencoded";
- SetWebRequest(request);
- return ReadXmlResponse(request.GetResponse());
- }
- /// <summary>
- /// 通用WebService调用(Soap),参数Pars为String类型的参数名、参数值
- /// </summary>
- public static XmlDocument QuerySoapWebService(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));
- }
- private static String ParsToString(Hashtable Pars)
- {
- StringBuilder sb = new StringBuilder();
- foreach (string k in Pars.Keys)
- {
- if (sb.Length > 0)
- {
- sb.Append("&");
- }
- if (Pars[k] == null)
- sb.Append(HttpUtility.UrlEncode(k) + "=\"\"");
- else
- 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);
- }
- }
|