最近项目中,用到动态调用webservice的内容,此处记录下来,留着以后COPY(我们只需要在XML,config文件,或者数据库中配置webservice连接地址和方法名即可使用);

  

  1. using System;
  2. using System.CodeDom;
  3. using System.CodeDom.Compiler;
  4. using System.Collections;
  5. using System.Collections.Generic;
  6. using System.Configuration;
  7. using System.Diagnostics;
  8. using System.IO;
  9. using System.Net;
  10. using System.Reflection;
  11. using System.Text;
  12. using System.Web.Services.Description;
  13. using System.Web.Services.Protocols;
  14. using System.Xml.Serialization;
  15. using Microsoft.CSharp;
  16.  
  17. namespace consoleTest
  18. {
  19. public class DynWebServiceUtil
  20. {
  21. private const string WS_WSDL = "?WSDL";
  22. private const string WS_DLL_SYSTEM = "System.dll";
  23. private const string WS_DLL_XML = "System.XML.dll";
  24. private const string WS_DLL_WS = "System.Web.Services.dll";
  25. private const string WS_DLL_DATA = "System.Data.dll";
  26. private const string WS_NAMESPACE = "EnterpriseServerBase.WebService.DynamicWebCalling";
  27.  
  28. // 保存已编译生成的webservice代理
  29. private static IDictionary<string, HttpWebClientProtocol> mWebServiceList;
  30.  
  31. /// <summary>
  32. /// 静态构造函数
  33. /// </summary>
  34. static DynWebServiceUtil()
  35. {
  36. mWebServiceList = new Dictionary<string, HttpWebClientProtocol>();
  37. }
  38.  
  39. /// <summary>
  40. /// 动态调用web服务
  41. /// </summary>
  42. /// <param name="url">地址</param>
  43. /// <param name="methodName">方法名</param>
  44. /// <param name="args">方法参数</param>
  45. /// <returns>方法返回值</returns>
  46. public static object InvokeWebService(string url, string methodName, object[] args)
  47. {
  48. string strProxyIp = ConfigurationManager.AppSettings["ProxyIp"];
  49. string strProxyPort = ConfigurationManager.AppSettings["ProxyPort"];
  50. WebProxy webProxy = string.IsNullOrEmpty(strProxyIp) || string.IsNullOrEmpty(strProxyPort)
  51. ? null : new WebProxy(strProxyIp, int.Parse(strProxyPort));
  52. return InvokeWebService(url, methodName, args, webProxy);
  53. }
  54.  
  55. /// <summary>
  56. /// 动态调用web服务
  57. /// </summary>
  58. /// <param name="url">地址</param>
  59. /// <param name="methodName">方法名</param>
  60. /// <param name="args">方法参数</param>
  61. /// <param name="webProxy">外网代理服务器</param>
  62. /// <returns>方法返回值</returns>
  63. public static object InvokeWebService(string url, string methodName, object[] args, WebProxy webProxy)
  64. {
  65. return InvokeWebService(url, null, methodName, args, webProxy);
  66. }
  67.  
  68. /// <summary>
  69. /// 动态调用web服务
  70. /// </summary>
  71. /// <param name="url">地址</param>
  72. /// <param name="className">类名</param>
  73. /// <param name="methodName">方法名</param>
  74. /// <param name="args">方法参数</param>
  75. /// <param name="webProxy">外网代理服务器</param>
  76. /// <returns>方法返回值</returns>
  77. public static object InvokeWebService(string url,
  78. string className, string methodName, object[] args, WebProxy webProxy)
  79. {
  80. ServicePointManager.Expect100Continue = false;
  81. HttpWebClientProtocol wsProxy = GetWebService(url, className, webProxy);
  82. MethodInfo mi = wsProxy.GetType().GetMethod(methodName);
  83.  
  84. try
  85. {
  86. return mi.Invoke(wsProxy, args);
  87. }
  88. catch (TargetInvocationException exTI)
  89. {
  90. throw new DynWebServiceMethodInvocationException(
  91. exTI.InnerException.Message,
  92. new Exception(exTI.InnerException.StackTrace));
  93. }
  94. }
  95.  
  96. /// <summary>
  97. /// 取得类名
  98. /// </summary>
  99. /// <param name="wsUrl">地址</param>
  100. /// <returns>类名</returns>
  101. private static string GetWsClassName(string wsUrl)
  102. {
  103. string[] parts = wsUrl.Split('/');
  104. string[] pps = parts[parts.Length - ].Split('.');
  105.  
  106. return pps[];
  107. }
  108.  
  109. /// <summary>
  110. /// 取得webservice代理类
  111. /// </summary>
  112. /// <param name="url">地址</param>
  113. /// <param name="className">类名</param>
  114. /// <param name="webProxy">外网代理服务器</param>
  115. /// <returns>webservice代理类</returns>
  116. private static HttpWebClientProtocol GetWebService(string url, string className, WebProxy webProxy)
  117. {
  118. string strUrl = url.ToLower();
  119. HttpWebClientProtocol wsProxy = null;
  120. if (mWebServiceList.ContainsKey(strUrl))
  121. {
  122. wsProxy = mWebServiceList[strUrl];
  123. }
  124. else
  125. {
  126. if (string.IsNullOrEmpty(className))
  127. {
  128. className = GetWsClassName(url);
  129. }
  130.  
  131. // 获取WSDL
  132. WebClient wc = new WebClient();
  133.  
  134. // 访问url是否需要通过代理服务器
  135. if (webProxy != null)
  136. {
  137. wc.Proxy = webProxy;
  138. }
  139.  
  140. Stream stream = wc.OpenRead(url + WS_WSDL);
  141. ServiceDescription sd = ServiceDescription.Read(stream);
  142. ServiceDescriptionImporter sdi = new ServiceDescriptionImporter();
  143. sdi.AddServiceDescription(sd, null, null);
  144.  
  145. // 生成客户端代理类代码
  146. CodeCompileUnit ccu = new CodeCompileUnit();
  147. CodeNamespace cn = new CodeNamespace(WS_NAMESPACE);
  148. ccu.Namespaces.Add(cn);
  149. sdi.Import(cn, ccu);
  150.  
  151. // 设定编译参数
  152. CompilerParameters cplist = new CompilerParameters();
  153. cplist.GenerateExecutable = false;
  154. cplist.GenerateInMemory = true;
  155. cplist.ReferencedAssemblies.Add(WS_DLL_SYSTEM);
  156. cplist.ReferencedAssemblies.Add(WS_DLL_XML);
  157. cplist.ReferencedAssemblies.Add(WS_DLL_WS);
  158. cplist.ReferencedAssemblies.Add(WS_DLL_DATA);
  159.  
  160. // 编译代理类
  161. CSharpCodeProvider csc = new CSharpCodeProvider();
  162. CompilerResults cr = csc.CompileAssemblyFromDom(cplist, ccu);
  163. if (cr.Errors.HasErrors)
  164. {
  165. StringBuilder sb = new StringBuilder();
  166. foreach (CompilerError ce in cr.Errors)
  167. {
  168. sb.Append(ce.ToString());
  169. sb.Append(Environment.NewLine);
  170. }
  171.  
  172. throw new DynWebServiceCompileException(sb.ToString());
  173. } // end of if (cr.Errors.HasErrors)
  174.  
  175. // 生成代理实例
  176. Assembly assembly = cr.CompiledAssembly;
  177. Type t = assembly.GetType(WS_NAMESPACE + "." + className, true, true);
  178. wsProxy = (HttpWebClientProtocol)Activator.CreateInstance(t);
  179. mWebServiceList[strUrl] = wsProxy;
  180. } // enf of if (mWebServiceList.ContainsKey(strUrl))
  181.  
  182. // 访问url是否需要通过代理服务器
  183. if (webProxy != null)
  184. {
  185. wsProxy.Proxy = webProxy;
  186. }
  187.  
  188. return wsProxy;
  189. }
  190.  
  191. }
  192. }
  193.  
  194. 调用:
    DynWebServiceUtil.InvokeWebService(
                        string.Format("{0}", tbWebService.Rows[0]["SERVICE_URL"]),
                        string.Format("{0}", tbWebService.Rows[0]["SERVICE_METHOD_NAME"]),
                        new object[] { "asnno"})

C# 动态调用webservice的更多相关文章

  1. Atitit 动态调用webservice与客户端代理方式调用

    Atitit 动态调用webservice与客户端代理方式调用 方式1: 使用call.invoke  直接调用WSDL,缺点:麻烦,不推荐--特别是JAVA调用.NET的WS时,会有不少的问题需要解 ...

  2. 动态调用WebService(C#) (非常实用)

    通常我们在程序中需要调用WebService时,都是通过“添加Web引用”,让VS.NET环境来为我们生成服务代理,然后调用对应的Web服务.这样是使工作简单了,但是却和提供Web服务的URL.方法名 ...

  3. 动态调用webservice(部分转载)

    动态调用webservice,做个笔记: public class WSHelper { /// < summary> /// 动态调用web服务 /// < /summary> ...

  4. 动态调用webservice及WCF服务

    动态调用web服务,该方法只针对Web service, WCF的服务不行,如果是WCF的就通过工具直接生产代理类,把代理类配置到调用的项目中,通过配置客户端的终结点动态的取实现: 通过Svcutil ...

  5. C# .NET 动态调用webservice的三种方式

    转载自 百度文库 http://wenku.baidu.com/link?url=Q2q50wohf5W6UX44zqotXFEe_XOMaib4UtI3BigaNwipOHKNETloMF4ax4W ...

  6. WebService – 2.动态调用WebService

    在本节课程中,将演示如何通过程序动态添加.调用.编译.执行WebService并返回结果. WebService动态调用示意图 WebService相关知识 代码文档对象模型CodeDom的使用 编程 ...

  7. 用C#通过反射实现动态调用WebService 告别Web引用

    我们都知道,调用WebService可以在工程中对WebService地址进行WEB引用,但是这确实很不方便.我想能够利用配置文件灵活调用WebService.如何实现呢? 用C#通过反射实现动态调用 ...

  8. 动态调用Webservice 支持Soapheader身份验证(转)

    封装的WebserviceHelp类: using System; using System.CodeDom; using System.CodeDom.Compiler; using System. ...

  9. [转]Net 下采用GET/POST/SOAP方式动态调用WebService C#实现

    本文转自:http://www.cnblogs.com/splendidme/archive/2011/10/05/2199501.html 一直以来,我们都为动态调用WebService方法而烦恼. ...

随机推荐

  1. sharepoint OWA问题解决

    请检查DNS   检查域名解析   cmd----nslookup---输入IP或者域名(计算机名)可以看到

  2. Opera Browser -- Access Restricted Sites using Free VPN /Free VPN Services List

    Opera Browser  -- Access Restricted Sites using Free VPN: currently the feature is available in Oper ...

  3. JDK7 tomcat6 各种环境变量配置

    JDK JAVA_HOME:jdk路径,bin目录上一层 Path:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin CLASSPATH:.;%JAVA_HOME%\lib;%J ...

  4. Linux虚拟机添加新硬盘的全程图解

    查看网的文章,我将在vm虚拟机LinuxRedhat中添加一个新的硬盘, 过程大致如下: 1.选择"VM"----"setting"并打开,将光标定位在hard ...

  5. Pyqt adb 获取Android手机屏幕

    adb的全称为Android Debug Bridge,就是起到调试桥的作用.adb的工作方式比较特殊,采用监听Socket TCP 5554等端口的方式让IDE和Qemu通讯,默认情况下adb会da ...

  6. [数学]内接多边形求pi

  7. hdu 5073

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5073 思路:一开始忘了排序,wa了好几发...选择区间长度为N - K的连续的数, 然后其余的K个数都 ...

  8. ios10新特性-UserNotification

    引言:iOS的通知分本地通知和远程通知,iOS10之前采用的是UILocationNotification类,远程通知有苹果服务器进行转发,本地通知和远程通知其回调的处理都是通过AppDelegate ...

  9. BestCoder Round #86

    A题 Price List 巨水..........水的不敢相信. #include <cstdio> typedef long long LL; int main() { int T; ...

  10. ios8 设置单元格分割线无效

    原来: [self.tableView setSeparatorInset:UIEdgeInsetsMake(0, 0, 0, 0)];//分隔线紧贴左右边框 || [self.tableView s ...