WebSvcCaller.cs 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. using System;
  2. using System.Web;
  3. using System.Xml;
  4. using System.Collections;
  5. using System.Net;
  6. using System.Text;
  7. using System.IO;
  8. using System.Xml.Serialization;
  9. /// <summary>
  10. /// 利用WebRequest/WebResponse进行WebService调用的类
  11. /// </summary>
  12. public class WebSvcCaller
  13. {
  14. //<webServices>
  15. // <protocols>
  16. // <add name="HttpGet"/>
  17. // <add name="HttpPost"/>
  18. // </protocols>
  19. //</webServices>
  20. private static Hashtable _xmlNamespaces = new Hashtable();//缓存xmlNamespace,避免重复调用GetNamespace
  21. public static CookieContainer cc = new CookieContainer();
  22. /// <summary>
  23. /// 需要WebService支持Post调用
  24. /// </summary>
  25. public static string QueryPostWebService(String URL, String MethodName, Hashtable Pars)
  26. {
  27. HttpWebResponse response = null;
  28. string html = "";
  29. HttpWebRequest request = null;
  30. Pars.Add("roundnum", Guid.NewGuid());
  31. try
  32. {
  33. request = (HttpWebRequest)HttpWebRequest.Create(URL + "/" + MethodName);
  34. request.Method = "POST";
  35. request.ContentType = "application/x-www-form-urlencoded";
  36. request.CookieContainer = cc;
  37. SetWebRequest(request);
  38. byte[] data = EncodePars(Pars);
  39. WriteRequestData(request, data);
  40. response = (HttpWebResponse)request.GetResponse();
  41. }
  42. catch (WebException e)
  43. {
  44. response = e.Response as HttpWebResponse;
  45. }
  46. if (response != null)
  47. {
  48. response.Cookies = request.CookieContainer.GetCookies(request.RequestUri);
  49. StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
  50. html = sr.ReadToEnd();
  51. }
  52. return html;
  53. }
  54. /// <summary>
  55. /// 需要WebService支持Get调用
  56. /// </summary>
  57. public static XmlDocument QueryGetWebService(String URL, String MethodName, Hashtable Pars)
  58. {
  59. HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(URL + "/" + MethodName + "?" + ParsToString(Pars));
  60. request.Method = "GET";
  61. request.ContentType = "application/x-www-form-urlencoded";
  62. SetWebRequest(request);
  63. return ReadXmlResponse(request.GetResponse());
  64. }
  65. /// <summary>
  66. /// 通用WebService调用(Soap),参数Pars为String类型的参数名、参数值
  67. /// </summary>
  68. public static XmlDocument QuerySoapWebService(String URL, String MethodName, Hashtable Pars)
  69. {
  70. if (_xmlNamespaces.ContainsKey(URL))
  71. {
  72. return QuerySoapWebService(URL, MethodName, Pars, _xmlNamespaces[URL].ToString());
  73. }
  74. else
  75. {
  76. return QuerySoapWebService(URL, MethodName, Pars, GetNamespace(URL));
  77. }
  78. }
  79. private static XmlDocument QuerySoapWebService(String URL, String MethodName, Hashtable Pars, string XmlNs)
  80. {
  81. _xmlNamespaces[URL] = XmlNs;//加入缓存,提高效率
  82. HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(URL);
  83. request.Method = "POST";
  84. request.ContentType = "text/xml; charset=utf-8";
  85. //request.Headers.Add("SOAPAction", """ + XmlNs + (XmlNs.EndsWith("/") ? "" : "/") + MethodName + """);
  86. SetWebRequest(request);
  87. byte[] data = EncodeParsToSoap(Pars, XmlNs, MethodName);
  88. WriteRequestData(request, data);
  89. XmlDocument doc = new XmlDocument(), doc2 = new XmlDocument();
  90. doc = ReadXmlResponse(request.GetResponse());
  91. XmlNamespaceManager mgr = new XmlNamespaceManager(doc.NameTable);
  92. mgr.AddNamespace("soap", "http://schemas.xmlsoap.org/soap/envelope/");
  93. String RetXml = doc.SelectSingleNode("//soap:Body/*/*", mgr).InnerXml;
  94. doc2.LoadXml("<root>" + RetXml + "</root>");
  95. AddDelaration(doc2);
  96. return doc2;
  97. }
  98. private static string GetNamespace(String URL)
  99. {
  100. HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL + "?WSDL");
  101. SetWebRequest(request);
  102. WebResponse response = request.GetResponse();
  103. StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
  104. XmlDocument doc = new XmlDocument();
  105. doc.LoadXml(sr.ReadToEnd());
  106. sr.Close();
  107. return doc.SelectSingleNode("//@targetNamespace").Value;
  108. }
  109. private static byte[] EncodeParsToSoap(Hashtable Pars, String XmlNs, String MethodName)
  110. {
  111. XmlDocument doc = new XmlDocument();
  112. 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>");
  113. AddDelaration(doc);
  114. XmlElement soapBody = doc.CreateElement("soap", "Body", "http://schemas.xmlsoap.org/soap/envelope/");
  115. XmlElement soapMethod = doc.CreateElement(MethodName);
  116. soapMethod.SetAttribute("xmlns", XmlNs);
  117. foreach (string k in Pars.Keys)
  118. {
  119. XmlElement soapPar = doc.CreateElement(k);
  120. soapPar.InnerXml = ObjectToSoapXml(Pars[k]);
  121. soapMethod.AppendChild(soapPar);
  122. }
  123. soapBody.AppendChild(soapMethod);
  124. doc.DocumentElement.AppendChild(soapBody);
  125. return Encoding.UTF8.GetBytes(doc.OuterXml);
  126. }
  127. private static string ObjectToSoapXml(object o)
  128. {
  129. XmlSerializer mySerializer = new XmlSerializer(o.GetType());
  130. MemoryStream ms = new MemoryStream();
  131. mySerializer.Serialize(ms, o);
  132. XmlDocument doc = new XmlDocument();
  133. doc.LoadXml(Encoding.UTF8.GetString(ms.ToArray()));
  134. if (doc.DocumentElement != null)
  135. {
  136. return doc.DocumentElement.InnerXml;
  137. }
  138. else
  139. {
  140. return o.ToString();
  141. }
  142. }
  143. private static void SetWebRequest(HttpWebRequest request)
  144. {
  145. request.Credentials = CredentialCache.DefaultCredentials;
  146. request.Timeout = 10000;
  147. }
  148. private static void WriteRequestData(HttpWebRequest request, byte[] data)
  149. {
  150. request.ContentLength = data.Length;
  151. Stream writer = request.GetRequestStream();
  152. writer.Write(data, 0, data.Length);
  153. writer.Close();
  154. }
  155. private static byte[] EncodePars(Hashtable Pars)
  156. {
  157. return Encoding.UTF8.GetBytes(ParsToString(Pars));
  158. }
  159. private static String ParsToString(Hashtable Pars)
  160. {
  161. StringBuilder sb = new StringBuilder();
  162. foreach (string k in Pars.Keys)
  163. {
  164. if (sb.Length > 0)
  165. {
  166. sb.Append("&");
  167. }
  168. if (Pars[k] == null)
  169. sb.Append(HttpUtility.UrlEncode(k) + "=\"\"");
  170. else
  171. sb.Append(HttpUtility.UrlEncode(k) + "=" + HttpUtility.UrlEncode(Pars[k].ToString()));
  172. }
  173. return sb.ToString();
  174. }
  175. private static XmlDocument ReadXmlResponse(WebResponse response)
  176. {
  177. StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
  178. String retXml = sr.ReadToEnd();
  179. sr.Close();
  180. XmlDocument doc = new XmlDocument();
  181. doc.LoadXml(retXml);
  182. return doc;
  183. }
  184. private static void AddDelaration(XmlDocument doc)
  185. {
  186. XmlDeclaration decl = doc.CreateXmlDeclaration("1.0", "utf-8", null);
  187. doc.InsertBefore(decl, doc.DocumentElement);
  188. }
  189. }