C#动态调用webservice方法
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Net;using System.IO;using System.CodeDom.Compiler;using System.Reflection;using System.Web.Services.Description;using System.Xml.Serialization;using System.CodeDom;namespace CN100.Member.Utility{ public class WebServiceHelper { private static WebServiceHelper webService = null; public static WebServiceHelper Instance(string webServiceUrl, string NamSpace) { if (webService == null) { webService = new WebServiceHelper(webServiceUrl, NamSpace); } return webService; } private WebServiceHelper() { } /// <summary> /// webService地址 /// </summary> public string ServerUrl { get; set; } /// <summary> /// 调用类命名空间 /// </summary> public string NameSpace { get; set; } private WebServiceHelper(string webServiceUrl, string namSpace) { ServerUrl = webServiceUrl; NameSpace = namSpace; } /// <summary> /// 生成动态引用DLL /// </summary> /// <returns></returns> public bool GenerateWebService() { WebClient client = new WebClient(); String url = ServerUrl + "?WSDL";//这个地址可以写在Config文件里面,这里取出来就行了.在原地址后面加上: ?WSDL Stream stream = client.OpenRead(url); ServiceDescription description = ServiceDescription.Read(stream); ServiceDescriptionImporter importer = new ServiceDescriptionImporter();//创建客户端代理代理类。 importer.ProtocolName = "Soap"; //指定访问协议。 importer.Style = ServiceDescriptionImportStyle.Client; //生成客户端代理。 importer.CodeGenerationOptions = CodeGenerationOptions.GenerateProperties | CodeGenerationOptions.GenerateNewAsync; importer.AddServiceDescription(description, null, null); //添加WSDL文档。 CodeNamespace nmspace = new CodeNamespace(); //命名空间 nmspace.Name = NameSpace; CodeCompileUnit unit = new CodeCompileUnit(); unit.Namespaces.Add(nmspace); ServiceDescriptionImportWarnings warning = importer.Import(nmspace, unit); CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp"); CompilerParameters parameter = new CompilerParameters(); parameter.GenerateExecutable = false; parameter.OutputAssembly = NameSpace + ".dll";//输出程序集的名称 parameter.ReferencedAssemblies.Add("System.dll"); parameter.ReferencedAssemblies.Add("System.XML.dll"); parameter.ReferencedAssemblies.Add("System.Web.Services.dll"); parameter.ReferencedAssemblies.Add("System.Data.dll"); CompilerResults result = provider.CompileAssemblyFromDom(parameter, unit); if (result.Errors.HasErrors) { // 显示编译错误信息 return false; } return true; } private Assembly LoadAssembly(string nameSpace) { Assembly asm = null; try { asm=Assembly.LoadFrom(nameSpace + ".dll");//加载前面生成的程序集 } catch (FileNotFoundException ex) { if (GenerateWebService()) { asm=Assembly.LoadFrom(nameSpace + ".dll");//加载前面生成的程序集 } } catch (Exception e) { throw e; } return asm; } /// <summary> /// 执行无返回值方法 /// </summary> /// <param name="methodName"></param> /// <param name="nameSpace"></param> /// <param name="args"></param> public void ExcuteMethod(string methodName,string nameSpace,params object[] args) { Assembly asm = LoadAssembly(nameSpace); Type t = asm.GetType(nameSpace); object o = Activator.CreateInstance(t); MethodInfo method = t.GetMethod(methodName); method.Invoke(o, args); } public void ExcuteMethod(string methodName,params object[] args) { string nameSpace = NameSpace; ExcuteMethod(methodName, nameSpace, args); } /// <summary> /// 执行带返回值方法 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="methodName"></param> /// <param name="nameSpace"></param> /// <param name="args"></param> /// <returns></returns> public T ExcuteMethod<T>(string methodName, string nameSpace,params object[] args) { Assembly asm = LoadAssembly(nameSpace); Type t = asm.GetType(nameSpace); object o = Activator.CreateInstance(t); MethodInfo method = t.GetMethod(methodName); T result = (T)method.Invoke(o, args); return result; } public T ExcuteMethod<T>(string methodName,params object[] args) { string nameSpace=NameSpace; return ExcuteMethod<T>(methodName, nameSpace, args); } }}