在做多个系统集成的时候,由于各系统厂商采用不同的架构,在项目实施前期,各业务对业务理解不够深入,系统接口可能会有较多变化,

在此背景下,动态调用webserivce就变得灵活了,降低了系统集成的耦合度。

下面介绍动态调用的具体步骤:

具体步骤:

1. 从目标 URL 下载 WSDL 数据。
2. 使用 ServiceDescription 创建和格式化 WSDL 文档文件。
3. 使用 ServiceDescriptionImporter 创建客户端代理类。
4. 使用 CodeDom 动态创建客户端代理类程序集。
5. 利用反射调用相关 WebService 方法。

其实与手工创建添加引用步骤一样,只是在这里把手动变成了自动而已,动态生成代理类,利用反射动态调用了方法。

下面看代码:代码也是摘自博友的,只是作了一些小的修改,

/// < summary>
/// 动态调用web服务
/// < /summary>
/// < param name="url">WSDL服务地址< /param>
/// < param name="classname">类名< /param>
/// < param name="methodname">方法名< /param>
/// < param name="args">参数< /param>
/// < returns>< /returns>
public object InvokeWebService(string url, string classname, string methodname, object[] args)
{
string @namespace = "EnterpriseServerBase.WebService.DynamicWebCalling";
if ((classname == null) || (classname == ""))
{
classname = CommonServiceHelper.GetWsClassName(url);
}
try
{
//获取WSDL
WebClient wc = new WebClient();
Stream stream = wc.OpenRead(url + "?WSDL");
ServiceDescription sd = ServiceDescription.Read(stream);
ServiceDescriptionImporter sdi = new ServiceDescriptionImporter();
sdi.AddServiceDescription(sd, "", "");
CodeNamespace cn = new CodeNamespace(@namespace);
//生成客户端代理类代码
CodeCompileUnit ccu = new CodeCompileUnit();
ccu.Namespaces.Add(cn);
sdi.Import(cn, ccu);
CSharpCodeProvider icc = new CSharpCodeProvider();
//设定编译参数
CompilerParameters cplist = new CompilerParameters();
cplist.GenerateExecutable = false;
cplist.GenerateInMemory = true;
cplist.ReferencedAssemblies.Add("System.dll");
cplist.ReferencedAssemblies.Add("System.XML.dll");
cplist.ReferencedAssemblies.Add("System.Web.Services.dll");
cplist.ReferencedAssemblies.Add("System.Data.dll");
//编译代理类
CompilerResults cr = icc.CompileAssemblyFromDom(cplist, ccu);
if (true == cr.Errors.HasErrors)
{
System.Text.StringBuilder sb = new System.Text.StringBuilder();
foreach (System.CodeDom.Compiler.CompilerError ce in cr.Errors)
{
sb.Append(ce.ToString());
sb.Append(System.Environment.NewLine);
}
throw new Exception(sb.ToString());
}
//生成代理实例,并调用方法
System.Reflection.Assembly assembly = cr.CompiledAssembly;
Type t = assembly.GetType(@namespace + "." + classname, true, true);
object obj = Activator.CreateInstance(t);
System.Reflection.MethodInfo mi = t.GetMethod(methodname);
return mi.Invoke(obj, args);
/*
* PropertyInfo propertyInfo = type.GetProperty(propertyname);
* return propertyInfo.GetValue(obj, null);
* */
}
catch (Exception ex)
{
throw new Exception(ex.InnerException.Message, new Exception(ex.InnerException.StackTrace));
}
}
private static string GetWsClassName(string wsUrl)
{
string[] parts = wsUrl.Split('/');
string[] pps = parts[parts.Length - ].Split('.');
return pps[];
}
/// <summary>
///InvokeWebService 的测试
///</summary>
[TestMethod()]
public void InvokeWebServiceTest()
{
CommonServiceHelper target = new CommonServiceHelper(); // TODO: 初始化为适当的值
string url = "http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx"; // TODO: 初始化为适当的值
string classname = string.Empty; // TODO: 初始化为适当的值
string methodname = "getWeather"; // TODO: 初始化为适当的值
string[] a = new string[] { "bj","" };
object[] args = a; // TODO: 初始化为适当的值
object expected = null; // TODO: 初始化为适当的值
object actual;
actual = target.InvokeWebService(url, classname, methodname, args);
Assert.AreEqual(expected, actual);
Assert.Inconclusive("验证此测试方法的正确性。");
}

转自http://www.cnblogs.com/langhua/p/3344784.html

最新文章

  1. Quickly place a window to another screen using only the keyboard
  2. [Unity3D入门]入门级游戏项目&quot;坦克狙击手&quot;更新
  3. Android 如何在Eclipse中查看Android API源码 及 support包源码
  4. 第三十九章 微服务CICD(1)- gitlab搭建与使用(docker版)
  5. asp.net记住我功能
  6. Iframe 自适应高度的方法!
  7. SCGHR_存储过程(eSP_IDChangeStart)_政治面貌为什么不能正确更新
  8. 【Linux】CentOS 学习笔记之二(命令)
  9. Java中获取当前日期
  10. R语言实现︱局部敏感哈希算法(LSH)解决文本机械相似性的问题(二,textreuse介绍)
  11. JAVA执行远端服务器的脚本
  12. Qt 中用QProcess调用cmd命令
  13. Thread类中的join方法
  14. 前端 HTML body标签相关内容 常用标签 表单标签 form里面的 input标签介绍
  15. Python全栈-day1-day2-计算机基础
  16. Android高级_视频播放控件
  17. PostgreSQL内核分析——BTree索引
  18. 多语言 SEO
  19. 【剑指offer】数字在排序数组中出现的次数,C++实现
  20. HDU 1372 Knight Moves (广搜)

热门文章

  1. DirectStream、Stream的区别-SparkStreaming源码分析02
  2. 关于Solr6.0中solrj使用简单例子
  3. 在开发JavaBean的过程中打开Tomcat的reloadable
  4. style弹出带滚动条的虚拟窗口
  5. 实践中更高效、实现起来相对简单的基于末尾坏字符原则的BM算法实现
  6. linux 中的进程wait()和waitpid函数,僵尸进程详解,以及利用这两个函数解决进程同步问题
  7. 用STS创建Maven的Web项目&lt;转&gt;
  8. linux内存查看及释放
  9. java中main函数解析
  10. thinkphp 自动跟新时间