调用示例

  1.   string url = "http://localhost:8080/server/PatientService.asmx";
    Hashtable ht = new Hashtable();
    ht.Add("start_time", starttime);
    XmlDocument xx = WebServiceCaller.QueryGetWebService(url, soapmethod, ht);

实现方法类

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

C# 动态调取 soap 接口的更多相关文章

  1. C#动态webservice调用接口 (JAVA,C#)

    C#动态webservice调用接口 using System; using System.Collections; using System.IO; using System.Net; using ...

  2. 详解C#泛型(二) 获取C#中方法的执行时间及其代码注入 详解C#泛型(一) 详解C#委托和事件(二) 详解C#特性和反射(四) 记一次.net core调用SOAP接口遇到的问题 C# WebRequest.Create 锚点“#”字符问题 根据内容来产生一个二维码

    详解C#泛型(二)   一.自定义泛型方法(Generic Method),将类型参数用作参数列表或返回值的类型: void MyFunc<T>() //声明具有一个类型参数的泛型方法 { ...

  3. c#动态调用WEBSERVICE接口

    C#动态webservice调用接口 1 using System; 2 using System.Collections; 3 using System.IO; 4 using System.Net ...

  4. C#动态调用WCF接口,两种方式任你选。

    写在前面 接触WCF还是它在最初诞生之处,一个分布式应用的巨作. 从开始接触到现在断断续续,真正使用的项目少之又少,更谈不上深入WCF内部实现机制和原理去研究,最近自己做一个项目时用到了WCF. 从这 ...

  5. PHP调用内容DES加密的SOAP接口

    本文以方倍工作室优惠券接口开发为例,介绍PHP下DES加解密及SOAP接口调用的实现过程. 一.基础概念 DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加 ...

  6. 动态调用wcf接口服务

    1.url:http://localhost:8002/名称.svc/basic(.svc结尾) 2.需要引用的命名空间System.ServiceModel 3.调用代码: public class ...

  7. SSH动态查询封装接口介绍

    SSH动态查询封装接口介绍 1.查询记录总条数 public int count(Class c,Object[][] eq,Object[][] like,String[] group,String ...

  8. C#动态调用WCF接口

    C#动态调用WCF接口 写在前面 接触WCF还是它在最初诞生之处,一个分布式应用的巨作. 从开始接触到现在断断续续,真正使用的项目少之又少,更谈不上深入WCF内部实现机制和原理去研究,最近自己做一个项 ...

  9. 记一次.net core调用SOAP接口遇到的问题

    背景        最近需要将一些外部的Web Service及其他SOAP接口的调用移到一个独立的WebAPI项目中,然后供其他.Net Core项目调用.之前的几个Web Service已经成功迁 ...

随机推荐

  1. The goal you specified requires a project to execute but there is no POM in this directory

    [INFO] Scanning for projects... [INFO] ------------------------------------------------------------- ...

  2. SpringCloud——服务网关

    1.背景 上篇博客<SpringCloud--Eureka服务注册和发现>中介绍了注册中心Eureka.服务提供者和服务消费者.这篇博客我们将介绍服务网关. 图(1) 未使用服务网关的做法 ...

  3. 【前端学习笔记04】JavaScript数据通信Ajax方法封装

    //Ajax 方法封装 //设置数据格式 function setData(data){ if(!data){ return ''; } else{ var arr = []; for(k in da ...

  4. 【bzoj3130】[Sdoi2013]费用流 二分+网络流最大流

    题目描述 Alice和Bob做游戏,给出一张有向图表示运输网络,Alice先给Bob一种最大流方案,然后Bob在所有边上分配总和等于P的非负费用.Alice希望总费用尽量小,而Bob希望总费用尽量大. ...

  5. 【JavaScript&jQuery】省市区三级联动

    HTML: <%@page import="com.mysql.jdbc.Connection"%> <%@ page language="java&q ...

  6. 【转】小心stringstream.str()字符串用法的陷阱

    --------------------- 作者:心中那自由的世界 来源:CSDN 原文:https://blog.csdn.net/119365374/article/details/7744678 ...

  7. 创建Django的App

    一. 新建1个App,命令:python manage.py startapp lib 1. 打开终端 2. 新建 3. 把业务代码放到每一个APP里面就更专业了. 修改urls里面的代码如下: 运行 ...

  8. [BJWC2011]元素 线性基

    题面 题面 题解 一个方案合法,当且仅当选取的01串凑不出0. 因此就是要使得选取的01串全在线性基内,具体原因可以看这道题:[CQOI2013]新Nim游戏 线性基 要使得魔力值最大,只需要按法力值 ...

  9. 【BZOJ2879】【NOI2012】美食节(费用流)

    [BZOJ2879][NOI2012]美食节(费用流) 题面 BZOJ 洛谷 题解 一眼就会思路了吧. 把每个厨师拆点,拆分为他最多能要做的菜的个数,即\(\sum p_i\) 然后把每个菜向厨师的每 ...

  10. ZJOI2018 D1

    归途的车上满是悲伤的气息 虽然早就预言到D1会滚粗,但一切都结束之后还是特别难过. 延时15min 50min T1 30pts 1.5h T2 10pts 2.5h T1 50pts 4.5h T3 ...