动态调用webservice,做个笔记:

  1. public class WSHelper
  2. {
  3. /// < summary>
  4. /// 动态调用web服务
  5. /// < /summary>
  6. /// < param name="url">WSDL服务地址< /param>
  7. /// < param name="methodname">方法名< /param>
  8. /// < param name="args">参数< /param>
  9. /// < returns>< /returns>
  10. public static object InvokeWebService(string url, string methodname, object[] args)
  11. {
  12. return WSHelper.InvokeWebService(url, null, methodname, args);
  13. }
  14. /// < summary>
  15. /// 动态调用web服务
  16. /// < /summary>
  17. /// < param name="url">WSDL服务地址< /param>
  18. /// < param name="classname">类名< /param>
  19. /// < param name="methodname">方法名< /param>
  20. /// < param name="args">参数< /param>
  21. /// < returns>< /returns>
  22. public static object InvokeWebService(string url, string classname, string methodname, object[] args)
  23. {
  24. string @namespace = "EnterpriseServerBase.WebService.DynamicWebCalling";
  25. if ((classname == null) || (classname == ""))
  26. {
  27. classname = WSHelper.GetWsClassName(url);
  28. }
  29. try
  30. { //获取WSDL
  31. WebClient wc = new WebClient();
  32. Stream stream = wc.OpenRead(url + "?WSDL");
  33. ServiceDescription sd = ServiceDescription.Read(stream);
  34. ServiceDescriptionImporter sdi = new ServiceDescriptionImporter();
  35. sdi.AddServiceDescription(sd, "", "");
  36. CodeNamespace cn = new CodeNamespace(@namespace);
  37. //生成客户端代理类代码
  38. CodeCompileUnit ccu = new CodeCompileUnit();
  39. ccu.Namespaces.Add(cn);
  40. sdi.Import(cn, ccu);
  41. CSharpCodeProvider icc = new CSharpCodeProvider();
  42. //设定编译参数
  43. CompilerParameters cplist = new CompilerParameters();
  44. cplist.GenerateExecutable = false;
  45. cplist.GenerateInMemory = true;
  46. cplist.ReferencedAssemblies.Add("System.dll");
  47. cplist.ReferencedAssemblies.Add("System.XML.dll");
  48. cplist.ReferencedAssemblies.Add("System.Web.Services.dll");
  49. cplist.ReferencedAssemblies.Add("System.Data.dll");
  50. //编译代理类
  51. CompilerResults cr = icc.CompileAssemblyFromDom(cplist, ccu);
  52. if (true == cr.Errors.HasErrors)
  53. {
  54. System.Text.StringBuilder sb = new System.Text.StringBuilder();
  55. foreach (System.CodeDom.Compiler.CompilerError ce in cr.Errors)
  56. {
  57. sb.Append(ce.ToString());
  58. sb.Append(System.Environment.NewLine);
  59. }
  60. throw new Exception(sb.ToString());
  61. }
  62. //生成代理实例,并调用方法
  63. System.Reflection.Assembly assembly = cr.CompiledAssembly;
  64. Type t = assembly.GetType(@namespace + "." + classname, true, true);
  65. object obj = Activator.CreateInstance(t);
  66. System.Reflection.MethodInfo mi = t.GetMethod(methodname);
  67. return mi.Invoke(obj, args);
  68. // PropertyInfo propertyInfo = type.GetProperty(propertyname);
  69. //return propertyInfo.GetValue(obj, null);
  70. }
  71. catch (Exception ex)
  72. {
  73. throw new Exception(ex.InnerException.Message, new Exception(ex.InnerException.StackTrace));
  74. }
  75. }
  76. private static string GetWsClassName(string wsUrl)
  77. {
  78. string[] parts = wsUrl.Split('/');
  79. string[] pps = parts[parts.Length - ].Split('.');
  80. return pps[];
  81. }
  82. }

需要在web.config中添加webservice的地址。

  1. <add key="ConnetionHisExist" value="http://10.10.99.8:8808/HisIsExist.asmx"/>
  2. <!--<add key="ConnetionUrlMsg" value="http://10.10.99.8:8082/MessageApi.asmx"/>-->
  3. <add key="ConnetionUrlMsg" value="http://112.74.203.57:8000/MessageApi.asmx"/>

动态调用方式:

1、取得webconfig中的webservice的值

  1. string MsgWebServiceurl = ConfigurationManager.AppSettings["ConnetionUrlMsg"].ToString();//取得webconfig中webservice值

2、组建字符串数组,访问

  1. string strxml = "<?xml version=\"1.0\" encoding=\"utf-8\" ?>" +
  2. "<data>" +
  3. "<OrderNo>" + dt.Rows[]["order_no"].ToString() + "</OrderNo>" +
  4. "<MerBillNo>" + dt.Rows[]["merchant_billno"].ToString() + "</MerBillNo>" +
  5. "<RefundMethod>" + "" + "</RefundMethod>" +
  6. "<Amount>" + dt.Rows[]["real_cost"].ToString() + "</Amount>" +
  7. "<OperUser>" + dt.Rows[]["oper_user"].ToString() + "</OperUser>" +
  8. "<TermNo>" + dt.Rows[]["termno"].ToString() + "</TermNo>" +
  9. "<HisRefundNo>" + dt.Rows[]["merchant_billno"].ToString() + "</HisRefundNo>" +
  10. "<HisNo>" + dt.Rows[]["merchant_billno"].ToString() + "</HisNo>" +
  11. "<ChannelTransNo>" + dt.Rows[]["tran_no"].ToString() + "</ChannelTransNo>" +
  12. "<PayAppSource>" + dt.Rows[]["payappcode"].ToString() + "</PayAppSource>" +
  13. "<PaySourceCode>" + dt.Rows[]["paysourcecode"].ToString() + "</PaySourceCode>" +
  14. "<Flushes>" + "" + "</Flushes>" +//0-退款 1-冲正
  15. "<SignType>" + "" + "</SignType>" +
  16. "<SignData>" + SignData + "</SignData>" +
  17. "</data>";
  18.  
  19. string[] argsMsg = new string[];//组建字符串数组
  20. argsMsg[] = "F000105";//访问类型
  21. argsMsg[] = strxml;//入参
  22. argsMsg[] = "xml";//返回类型 xml ,json
  23. object Msgresult = WSHelper.InvokeWebService(MsgWebServiceurl, "MuPayInterface", argsMsg);

3、接下来对返回的object转化为字符串,然后解析这个字符串xml。

4、调用其他入参不是xml类型的

  1. string isExistWebServiceurl = ConfigurationManager.AppSettings["ConnetionHisExist"].ToString();//取得webconfig中webservice值
  2.  
  3. string[] args = new string[];
  4. args[] = tran_no;
  1. object result = WSHelper.InvokeWebService(isExistWebServiceurl, "HisExistsOrNot", args);

返回的result是一个int类型,进行转换后,即可用了。

动态调用webservice(部分转载)的更多相关文章

  1. 用C#通过反射实现动态调用WebService 告别Web引用(转载)

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

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

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

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

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

  4. 动态调用webservice时 ServiceDescriptionImporter类在vs2010无法引用的解决方法

    [导读]ServiceDescriptionImporter是创建Web Service 时使用的类,它是引用继承System.Web.Services 当我将VS2005里写的一段代码放在VS201 ...

  5. 浅谈WebService开发三(动态调用WebService)转

    在前两讲里,我已经向大家演示了如何使用WebService.同步, 异步调用WebService,而在实际开发过程中,可能会有多个WebService接口供你选择,而在程序执行过程中才决定使用哪一个 ...

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

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

  7. C# 动态调用webservice

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

  8. 动态调用webservice及WCF服务

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

  9. WebService – 2.动态调用WebService

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

随机推荐

  1. js简单弹出层、遮罩层

    <html> <head> <title>js简单弹出层</title> <style> /*阴影边框效果*/ .box-shadow-1 ...

  2. Uva 2034

    求定积分 (结果当时我没看到平均值) //正常多项式求 #include<iostream> #include<cstdio> #include<cmath> us ...

  3. 示例开发过程记录:meteor,react,apollo

    本示例记录一个开发过程: 1)参考 Meteor React TUTORIAL教程 https://www.meteor.com/tutorials/react/creating-an-app 2). ...

  4. java7

    1:Eclipse的概述使用(掌握) 请参照ppt和课堂练习.txt 2:API的概述(了解) (1)应用程序编程接口. (2)就是JDK提供给我们的一些提高编程效率的java类. 3:Object类 ...

  5. robotframework----模板的使用

    模板只能放在测试用例里,可以测试大数据量,每一行模板的值,都做为用户关键字的输入参数,发下图: 删除特定证书2 的用户关键字如下:

  6. JTabbedPane 和 JScrollBar 联合使用

    需求:实现一个JTabbed, 当下拉到Tabbed的底部时,自动加载下一次的数据. 下面是具体代码: import java.awt.*; import javax.swing.table.Defa ...

  7. iOS开发UI篇—核心动画(转场动画和组动画)

    转自:http://www.cnblogs.com/wendingding/p/3801454.html iOS开发UI篇—核心动画(转场动画和组动画) 一.转场动画简单介绍 CAAnimation的 ...

  8. 3.使用OGG进程进行初始化数据

    开始初始化数据的时候要满足下面的条件: 1.disable掉目标段表的外键约束 2.disable掉目标端表的触发器 3.删除目标段表的索引,加快初始化速度 4.目标端表结构创建完成 源端配置初始化抽 ...

  9. RESTful API 设计指南 (转)

    RESTful API 设计指南 2016-02-23 ImportNew (点击上方公号,可快速关注) 作者:阮一峰 链接:http://www.ruanyifeng.com/blog/2014/0 ...

  10. java打包文件夹为zip文件

    //待压缩的文件目录 String sourceFile=sourceFilePath+"\\"+userName; //存放压缩文件的目录 String zipFilePath ...