模块开发总结:
c#动态调用webservices
来自网络及使用心得。

msdn:
MethodBase.Invoke 方法 (Object, Object[])
使用指定的参数调用当前实例所表示的方法或构造函数。

public Object Invoke (
Object obj,
Object[] parameters
)

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

参数
obj

对其调用方法或构造函数的对象。如果方法是静态的,则忽略此参数。如果构造函数是静态的,则此参数必须为 空引用(在 Visual Basic 中为 Nothing) 或定义该构造函数的类的实例。

parameters

调用的方法或构造函数的参数列表。这是一个对象数组,这些对象与要调用的方法或构造函数的参数具有相同的数量、顺序和类型。如果没有任何参数,则parameters 应为 空引用(在 Visual Basic 中为 Nothing)。

如果此实例所表示的方法或构造函数采用 ref 参数(在 Visual Basic 中为 ByRef),使用此函数调用该方法或构造函数时,该参数不需要任何特殊属性。如果数组中的对象未用值来显式初始化,则该对象将包含该对象类型的默认值。对于引用类型的元素,该值为 空引用(在 Visual Basic 中为 Nothing)。对于值类型的元素,该值为 0、0.0 或 false,具体取决于特定的元素类型。

返回值

一个对象,包含被调用方法的返回值,如果调用的是构造函数,则为 空引用(在 Visual Basic 中为 Nothing)。

 

xfire中提供的webservices(创建过程见baidu,很多很好)

public String invokedUseArray(String[] msgArray){
for (int i = 0; i < msgArray.length; i++) {
System.out.println(msgArray[i]);
}
return "1";
} public String invokedUseString(String title,String desc){
System.out.println(title+"\t"+desc);
return "1";
}

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

c#调用

string webserviceUrl==http://localhost:8080/bomcbpinterface/services/CreateGevtIncidentService;

string title =”title”;
string desc =”description”; string methodNameArray=”invokedUseArray”; string[] argsArray={title,desc} object result1 = WebServiceHelper.InvokeWebService(webserviceUrl,null,methodNameArray,new object[]{argsArray});//容易出错,报参数个数不对的异常 string methodNameString=”invokedUseString” object result2 = WebServiceHelper.InvokeWebService(webserviceUrl, null, methodNameString,argsArray);//容易出错,报参数个数不对的异常
或 object result2 = WebServiceHelper.InvokeWebService(webserviceUrl, null, methodNameString,new object[]{title,desc});//容易出错,报参数个数不对的异常

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

 

Utility:

需要添加引用:System.Web.Service

需要将.net 4.0 framework client profile,我们应该将它改成 .net 4.0 framework(VS2010)

具体步骤:

1. 从目标 URL 下载 WSDL 数据。

2. 使用 ServiceDescription 创建和格式化 WSDL 文档文件。

3. 使用 ServiceDescriptionImporter 创建客户端代理类。

4. 使用 CodeDom 动态创建客户端代理类程序集。

5. 利用反射调用相关 WebService 方法。

具体代码:

    class WebServiceHelper
{ #region InvokeWebService /// <summary>
/// 动态调用web服务
/// </summary>
/// <param name="url">webservice url:http://xxx/zzz </param>
/// <param name="className">className</param>
/// <param name="methodName">methodName</param>
/// <param name="args">the parameters used by methodName</param>
/// <returns>type:object.Genanally,the result of the invoke operation</returns>
public static object InvokeWebService(string url, string className, string methodName, object[] args)
{ //string @namespace = "alarm.mobile.work.inter.bomc.boco.com";
string @namespace = GetNamespace(url);
logger.Info(@namespace);
if ((className == null) || (className == ""))
{
className = WebServiceHelper.GetWsClassName(url);
logger.Info(className);
}
try
{
logger.Info(className);
// 1. 使用 WebClient 下载 WSDL 信息。
WebClient wc = new WebClient();
//ServiceDescription类提供一种方法,以创建和格式化用于描述 XML Web services 的有效的 Web 服务描述语言 (WSDL) 文档文件,该文件是完整的,具有适当的命名空间、元素和特性。 无法继承此类。
//ServiceDescription.Read 方法 (Stream) 通过直接从 Stream实例加载 XML 来初始化ServiceDescription类的实例。
Stream stream = wc.OpenRead(url + "?WSDL"); // 2. 创建和格式化 WSDL 文档。
ServiceDescription sd = ServiceDescription.Read(stream); // 3. 创建客户端代理代理类。
//ServiceDescriptionImporter 类 公开一种为 XML Web services 生成客户端代理类的方法。
//ServiceDescriptionImporter.AddServiceDescription 方法 将指定的ServiceDescription添加到要导入的ServiceDescriptions值的集合中。
ServiceDescriptionImporter sdi = new ServiceDescriptionImporter();
sdi.ProtocolName = "soap";
sdi.AddServiceDescription(sd, "", "");
// 4. 使用 CodeDom 编译客户端代理类。
//CodeNamespace表示命名空间声明
CodeNamespace cn = new CodeNamespace(@namespace);// 为代理类添加命名空间,缺省为全局空间。
logger.Info(cn.Name);
//生成客户端代理类代码
// CodeCompileUnit会提供一个CodeDOM程式圆形的容器,CodeCompileUnit含有一个集合,
//可以储存含有CodeDOM原始程式码原形,专案参考的组件集合以及专案组件属性集合的CodeNamespace物件。
CodeCompileUnit ccu = new CodeCompileUnit();
ccu.Namespaces.Add(cn);
sdi.Import(cn, ccu);
// CSharpCodeProvider类提供存取C#程式码产生器和程式码编译器的执行个体。
CodeDomProvider provider = 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表示从编译器返回的编译结果。使用指定的编译器设定,
//根据CodeCompileUnit物件之指定阵列所包含的System.CodeDom树状结构,编译一个组件。
CompilerResults cr = provider.CompileAssemblyFromDom(cplist, ccu);
//5. 使用 Reflection 调用 WebService 。
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);
}
logger.Error(sb.ToString());
//throw new Exception(sb.ToString());
}
//生成代理实例,并调用方法
System.Reflection.Assembly assembly = cr.CompiledAssembly;
// 如果在前面为代理类添加了命名空间,此处需要将命名空间添加到类型前面。
Type t = assembly.GetType(@namespace + "." + className, true, true); //Type t = assembly.GetType(className, true, true);
// Activator类包含特定的方法,用以在本地或从远程创建对象类型,或获取对现有远程对象的引用。
//无法继承此类Activator.CreateInstance 方法 使用与指定参数匹配程度最高的构造函数创建指定类型的实例。
object obj = Activator.CreateInstance(t);
//MethodInfo 的实例可以通过调用GetMethods或者Type对象或派生自Type的对象的GetMethod方法来获取,
//还可以通过调用表示泛型方法定义的 MethodInfo 的MakeGenericMethod方法来获取。
System.Reflection.MethodInfo mi = t.GetMethod(methodName);
logger.Info(mi.DeclaringType);
return mi.Invoke(obj, args);
}
catch (Exception ex)
{
logger.Error(ex);
//throw new Exception(ex.InnerException.Message, new Exception(ex.InnerException.StackTrace));
return null;
}
}
/// <summary>
/// get the name of class name
/// </summary>
/// <param name="wsUrl">webservice url:http://xxx/zzz </param>
/// <returns></returns>
private static string GetWsClassName(string wsUrl)
{
string[] parts = wsUrl.Split('/');
string[] pps = parts[parts.Length - 1].Split('.');
return pps[0];
} /// <summary>
/// get the name of namespace
/// </summary>
/// <param name="URL">webservice url:http://xxx/zzz </param>
/// <returns></returns>
private static string GetNamespace(String URL)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL + "?WSDL");
SetWebRequest(request);
WebResponse response = request.GetResponse();
StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
XmlDocument doc = new XmlDocument();
doc.LoadXml(sr.ReadToEnd());
sr.Close();
string ns= doc.SelectSingleNode("//@targetNamespace").Value;
return ns.Split('/')[ns.Split('/').Length - 1];
}
private static void SetWebRequest(HttpWebRequest request)
{
request.Credentials = CredentialCache.DefaultCredentials;
request.Timeout = 10000;
} #endregion }

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

        #region InvokeWebService
//动态调用web服务
public static object InvokeWebService(string url, string className, string methodName, object[] args)
{
string @namespace = GetNamespace(url);
logger.Info(@namespace);
if ((className == null) || (className == ""))
{
className = WebServiceHelper.GetWsClassName(url);
logger.Info(className);
}
try
{
logger.Info(className);
// 1. 使用 WebClient 下载 WSDL 信息。
WebClient wc = new WebClient();
//ServiceDescription类提供一种方法,以创建和格式化用于描述 XML Web services 的有效的 Web 服务描述语言 (WSDL) 文档文件,该文件是完整的,具有适当的命名空间、元素和特性。 无法继承此类。
//ServiceDescription.Read 方法 (Stream) 通过直接从 Stream实例加载 XML 来初始化ServiceDescription类的实例。
Stream stream = wc.OpenRead(url + "?WSDL"); // 2. 创建和格式化 WSDL 文档。
ServiceDescription sd = ServiceDescription.Read(stream); // 3. 创建客户端代理代理类。
//ServiceDescriptionImporter 类 公开一种为 XML Web services 生成客户端代理类的方法。
//ServiceDescriptionImporter.AddServiceDescription 方法 将指定的ServiceDescription添加到要导入的ServiceDescriptions值的集合中。
ServiceDescriptionImporter sdi = new ServiceDescriptionImporter();
sdi.ProtocolName = "soap";
sdi.AddServiceDescription(sd, "", "");
// 4. 使用 CodeDom 编译客户端代理类。
//CodeNamespace表示命名空间声明
CodeNamespace cn = new CodeNamespace(@namespace);// 为代理类添加命名空间,缺省为全局空间。
logger.Info(cn.Name);
//生成客户端代理类代码
// CodeCompileUnit会提供一个CodeDOM程式圆形的容器,CodeCompileUnit含有一个集合,
//可以储存含有CodeDOM原始程式码原形,专案参考的组件集合以及专案组件属性集合的CodeNamespace物件。
CodeCompileUnit ccu = new CodeCompileUnit();
ccu.Namespaces.Add(cn);
sdi.Import(cn, ccu);
// CSharpCodeProvider类提供存取C#程式码产生器和程式码编译器的执行个体。
CodeDomProvider provider = 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表示从编译器返回的编译结果。使用指定的编译器设定,
//根据CodeCompileUnit物件之指定阵列所包含的System.CodeDom树状结构,编译一个组件。
CompilerResults cr = provider.CompileAssemblyFromDom(cplist, ccu);
//5. 使用 Reflection 调用 WebService 。
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);
}
logger.Error(sb.ToString());
//throw new Exception(sb.ToString());
}
//生成代理实例,并调用方法
System.Reflection.Assembly assembly = cr.CompiledAssembly;
// 如果在前面为代理类添加了命名空间,此处需要将命名空间添加到类型前面。
Type t = assembly.GetType(@namespace + "." + className, true, true); //Type t = assembly.GetType(className, true, true);
// Activator类包含特定的方法,用以在本地或从远程创建对象类型,或获取对现有远程对象的引用。
//无法继承此类Activator.CreateInstance 方法 使用与指定参数匹配程度最高的构造函数创建指定类型的实例。
object obj = Activator.CreateInstance(t);
//MethodInfo 的实例可以通过调用GetMethods或者Type对象或派生自Type的对象的GetMethod方法来获取,
//还可以通过调用表示泛型方法定义的 MethodInfo 的MakeGenericMethod方法来获取。
System.Reflection.MethodInfo mi = t.GetMethod(methodName);
logger.Info(mi.DeclaringType);
return mi.Invoke(obj, args);
}
catch (Exception ex)
{
logger.Error(ex);
//throw new Exception(ex.InnerException.Message, new Exception(ex.InnerException.StackTrace));
return null;
}
} private static string GetWsClassName(string wsUrl)
{
string[] parts = wsUrl.Split('/');
string[] pps = parts[parts.Length - 1].Split('.');
return pps[0];
} private static string GetNamespace(String URL)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL + "?WSDL");
SetWebRequest(request);
WebResponse response = request.GetResponse();
StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
XmlDocument doc = new XmlDocument();
doc.LoadXml(sr.ReadToEnd());
sr.Close();
string ns= doc.SelectSingleNode("//@targetNamespace").Value;
return ns.Split('/')[ns.Split('/').Length - 1];
}
private static void SetWebRequest(HttpWebRequest request)
{
request.Credentials = CredentialCache.DefaultCredentials;
request.Timeout = 10000;
} #endregion

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

msdn 中MethodBase.Invoke 方法 介绍中的坑的更多相关文章

  1. PHP删除数组中空值的方法介绍

    这篇文章主要介绍了PHP删除数组中空值的方法介绍,需要的朋友可以参考下 说来惭愧,以前在去掉数组的空值是都是强写foreach或者while的,利用这两个语法结构来删除数组中的空元素,简单代码如下: ...

  2. javascript中的splice方法介绍&示例

    javascript 中的 splice 方法很强大,它可以用于插入.删除或替换数组的元素. 下面来一一介绍! 删除:用于删除元素,两个参数,第一个参数(要删除第一项的位置),第二个参数(要删除的项数 ...

  3. java中的 java.util.concurrent.locks.ReentrantLock类中的lockInterruptibly()方法介绍

    在java的 java.util.concurrent.locks包中,ReentrantLock类实现了lock接口,lock接口用于加锁和解锁限制,加锁后必须释放锁,其他的线程才能进入到里面执行, ...

  4. java反射-Method中的invoke方法的用法-以及函数式接口和lambda表达式

    作者最近研究框架底层代码过程中感觉自己基础不太牢固,于是写了一点案例,以防日后忘记 接口类:Animals 1 public interface Animals { 2 3 public void e ...

  5. Java中Method.invoke方法,反射?

    正常来说,我们调用对象的方法是通过dot运算符来进行的,这里我们介绍另一种方法,有以下几个步骤:1,获取该类的Class Type:2,通过getMethod方法获取Method对象:3,通过调用in ...

  6. java中Method.invoke方法参数解析

    通过发射的机制,可以通过invoke方法来调用类的函数.invoke函数的第一个参数是调用该方法的实例,如果该方法是静态方法,那么可以用null或者用类来代替,第二个参数是变长的,是调用该方法的参数. ...

  7. JS实现循环删除数组中元素的方法介绍

    这篇文章主要给大家介绍了关于Javascript循环删除数组中元素的几种方法,文中给出了详细的示例代码供大家参考学习,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧. 本文主要跟大家分享了 ...

  8. jQuery中的index方法介绍

    从jq api手册摘过来的内容,index这个方法在写 tab silder 之类的组件还是比较有用的说. js没有传统的函数重载的概念,但是根据传入参数的不同,js的函数可以完成不同的功能,也可说是 ...

  9. Hanlp在ubuntu中的使用方法介绍

    HanLP的一个很大的好处是离线开源工具包,换而言之,它不仅提供免费的代码免费下载,而且将辛苦收集的词典也对外公开啦,此诚乃一大无私之举.我在安装的时候,主要参照这份博客: blog.csdn.net ...

随机推荐

  1. Django:如何给文章列表添加图片

    思路: 使用ajax方式将图片和文本一起通过formData提交到后台,Django后台通过request.POST和request.FILES方式接收数据 1.前端代码 {% extends 'ba ...

  2. C# RS232串口使用

    using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...

  3. day 81 天 ORM 操作复习总结

    # ###############基于对象查询(子查询)############## 一.对多查询  正向查询 from django.shortcuts import render,HttpResp ...

  4. Mac OS 10.12 - 如何关闭Rootless机制?

    一,进入恢复模式(Recovery):具体操作方法参见下面这篇博客: http://www.cnblogs.com/sunylat/p/6414697.html 二,关闭Rootless机制 1,选择 ...

  5. 2017 NAIPC A:Pieces of Parentheses

    my team solve the problem in the contest with similar ideathis is a more deep analysis The main idea ...

  6. C - 前m大的数 (结构体)

    点击打开链接 还记得Gardon给小希布置的那个作业么?(上次比赛的1005)其实小希已经找回了原来的那张数表,现在她想确认一下她的答案是否正确,但是整个的答案是很庞大的表,小希只想让你把答案中最大的 ...

  7. postgresql 脏读-dirtied

    共享缓冲区 在内存中读取或写入数据总是比在任何其他介质上更快.数据库服务器还需要用于快速访问数据的内存,无论是READ还是WRITE访问.在PostgreSQL中,这被称为"共享缓冲区&qu ...

  8. 【apio2007】【ctsc2007】 数据备份 贪心+链表+堆

    题目大意:有n个点,k条链,每个点离原点有一定的距离.要你用k条链连接2k个点,使得k条链的长度最短. 首先每次肯定是链相邻的2个点,所以我们先把相邻2个点的差值求出来,得到有n-1个数的数列. 然后 ...

  9. TP中使用laravel那一套验证

    ---恢复内容开始--- 1,tp5项目下新建一个extends目录,同时在入口文件index.php配置 define('EXTEND_PATH', '../extend/'); 结果: 2,加载l ...

  10. Postman—脚本介绍

    前言 Postman包含一个基于Node.js的强大的运行时环境,它允许我们为请求和集合添加动态行为.这使的我们可以编写测试用例,构建可包含动态参数的请求,在请求之间传递数据等等. 我们可以在流程中以 ...