C#动态调用webservice

因项目需求,需要调用多个webservice,因此不能使用服务引用,在网上找到一个动态调用的代码,测试可用,在此保留,以便日后再次使用

/// 根据指定的信息,调用远程WebService方法    
/// </summary>
/// <param name="url">WebService的http形式的地址</param>
/// <param name="nameSpace">欲调用的WebService的命名空间</param>
/// <param name="classname">欲调用的WebService的类名(不包括命名空间前缀)</param>
/// <param name="methodname">欲调用的WebService的方法名</param>
/// <param name="args">参数列表</param>
/// <returns>WebService的执行结果</returns>
private object InvokeWebservice(string url, string nameSpace, string classname, string methodname, object[] args)
{

try
{

//1.使用WebClient 下载WSDL信息
WebClient wc = new WebClient();
Stream stream = wc.OpenRead(url + "?WSDL");

//2.创建和格式化WSDL文档
ServiceDescription srvDesc = ServiceDescription.Read(stream);

//3. 创建客户端代理代理类
ServiceDescriptionImporter srvDescInporter = new ServiceDescriptionImporter();
srvDescInporter.ProtocolName = "Soap";//指定访问协议
srvDescInporter.Style = ServiceDescriptionImportStyle.Client;//生成客户端代理,默认。
srvDescInporter.AddServiceDescription(srvDesc, "", ""); //添加WSDL文档。

//4 .使用 CodeDom 编译客户端代理类。
CodeNamespace codeNamespce = new CodeNamespace(nameSpace);
CodeCompileUnit codeCompileUnit = new CodeCompileUnit();
codeCompileUnit.Namespaces.Add(codeNamespce);
srvDescInporter.Import(codeNamespce, codeCompileUnit);

CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");

//表示用于调用编译器的参数。
System.CodeDom.Compiler.CompilerParameters parameter = new System.CodeDom.Compiler.CompilerParameters();
parameter.GenerateExecutable = false; //设置是否生成可执行文件。
parameter.GenerateInMemory = true; //设置是否在内存中生成输出。
parameter.ReferencedAssemblies.Add("System.dll"); //ReferencedAssemblies 获取当前项目所引用的程序集。
parameter.ReferencedAssemblies.Add("System.XML.dll");
parameter.ReferencedAssemblies.Add("System.Web.Services.dll");
parameter.ReferencedAssemblies.Add("System.Data.dll");

//获取从编译器返回的编译结果。
System.CodeDom.Compiler.CompilerResults cr = provider.CompileAssemblyFromDom(parameter, codeCompileUnit);
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);

}
catch (Exception ex)
{
return ex.Message;
}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值