动态调用WebService方法

 

  
  
  
  
  1. using System; 
  2. using System.Collections.Generic; 
  3. using System.Linq; 
  4. using System.Text; 
  5. using System.Net; 
  6. using System.IO; 
  7. using System.CodeDom.Compiler; 
  8. using System.Reflection; 
  9. using System.Web.Services.Description; 
  10. using System.Xml.Serialization; 
  11. using System.CodeDom; 
  12.  
  13. namespace CN100.Member.Utility 
  14.     public class WebServiceHelper 
  15.     { 
  16.         private static WebServiceHelper webService = null
  17.  
  18.         public static WebServiceHelper Instance(string webServiceUrl, string NamSpace) 
  19.         { 
  20.             if (webService == null
  21.             { 
  22.                 webService = new WebServiceHelper(webServiceUrl, NamSpace); 
  23.             } 
  24.             return webService; 
  25.         } 
  26.  
  27.         private WebServiceHelper() 
  28.         {  
  29.          
  30.         } 
  31.  
  32.         /// <summary> 
  33.         /// webService地址 
  34.         /// </summary> 
  35.         public string ServerUrl 
  36.         { 
  37.             get
  38.             set
  39.         } 
  40.  
  41.         /// <summary> 
  42.         /// 调用类命名空间 
  43.         /// </summary> 
  44.         public string NameSpace 
  45.         { 
  46.             get
  47.             set
  48.         } 
  49.  
  50.         private WebServiceHelper(string webServiceUrl, string namSpace) 
  51.         { 
  52.             ServerUrl = webServiceUrl; 
  53.             NameSpace = namSpace; 
  54.         } 
  55.  
  56.         /// <summary> 
  57.         /// 生成动态引用DLL 
  58.         /// </summary> 
  59.         /// <returns></returns> 
  60.         public bool GenerateWebService() 
  61.         { 
  62.             WebClient client = new WebClient(); 
  63.             String url = ServerUrl + "?WSDL";//这个地址可以写在Config文件里面,这里取出来就行了.在原地址后面加上: ?WSDL 
  64.             Stream stream = client.OpenRead(url); 
  65.             ServiceDescription description = ServiceDescription.Read(stream); 
  66.             ServiceDescriptionImporter importer = new ServiceDescriptionImporter();//创建客户端代理代理类。 
  67.             importer.ProtocolName = "Soap"//指定访问协议。 
  68.             importer.Style = ServiceDescriptionImportStyle.Client; //生成客户端代理。 
  69.             importer.CodeGenerationOptions = CodeGenerationOptions.GenerateProperties | CodeGenerationOptions.GenerateNewAsync; 
  70.             importer.AddServiceDescription(description, nullnull); //添加WSDL文档。 
  71.             CodeNamespace nmspace = new CodeNamespace(); //命名空间 
  72.             nmspace.Name = NameSpace; 
  73.             CodeCompileUnit unit = new CodeCompileUnit(); 
  74.             unit.Namespaces.Add(nmspace); 
  75.  
  76.             ServiceDescriptionImportWarnings warning = importer.Import(nmspace, unit); 
  77.             CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp"); 
  78.  
  79.             CompilerParameters parameter = new CompilerParameters(); 
  80.             parameter.GenerateExecutable = false
  81.             parameter.OutputAssembly = NameSpace + ".dll";//输出程序集的名称 
  82.             parameter.ReferencedAssemblies.Add("System.dll"); 
  83.             parameter.ReferencedAssemblies.Add("System.XML.dll"); 
  84.             parameter.ReferencedAssemblies.Add("System.Web.Services.dll"); 
  85.             parameter.ReferencedAssemblies.Add("System.Data.dll"); 
  86.  
  87.             CompilerResults result = provider.CompileAssemblyFromDom(parameter, unit); 
  88.             if (result.Errors.HasErrors) 
  89.             { 
  90.                 // 显示编译错误信息 
  91.                 return false
  92.             } 
  93.             return true
  94.         } 
  95.  
  96.         private Assembly LoadAssembly(string nameSpace) 
  97.         { 
  98.             Assembly asm = null
  99.             try 
  100.             { 
  101.                 asm=Assembly.LoadFrom(nameSpace + ".dll");//加载前面生成的程序集 
  102.             } 
  103.             catch (FileNotFoundException ex) 
  104.             { 
  105.                 if (GenerateWebService()) 
  106.                 { 
  107.                     asm=Assembly.LoadFrom(nameSpace + ".dll");//加载前面生成的程序集 
  108.                 } 
  109.             } 
  110.             catch (Exception e) 
  111.             { 
  112.                 throw e; 
  113.             } 
  114.             return asm; 
  115.         } 
  116.  
  117.         /// <summary> 
  118.         /// 执行无返回值方法 
  119.         /// </summary> 
  120.         /// <param name="methodName"></param> 
  121.         /// <param name="nameSpace"></param> 
  122.         /// <param name="args"></param> 
  123.         public void ExcuteMethod(string methodName,string nameSpace,object[] args) 
  124.         { 
  125.             Assembly asm = LoadAssembly(nameSpace); 
  126.             Type t = asm.GetType(nameSpace); 
  127.             object o = Activator.CreateInstance(t); 
  128.             MethodInfo method = t.GetMethod(methodName); 
  129.             method.Invoke(o, args); 
  130.         } 
  131.  
  132.         public void ExcuteMethod(string methodName, object[] args) 
  133.         { 
  134.             string nameSpace = NameSpace; 
  135.             ExcuteMethod(methodName, nameSpace, args); 
  136.         } 
  137.  
  138.         /// <summary> 
  139.         /// 执行带返回值方法 
  140.         /// </summary> 
  141.         /// <typeparam name="T"></typeparam> 
  142.         /// <param name="methodName"></param> 
  143.         /// <param name="nameSpace"></param> 
  144.         /// <param name="args"></param> 
  145.         /// <returns></returns> 
  146.         public T ExcuteMethod<T>(string methodName, string nameSpace, object[] args) 
  147.         { 
  148.             Assembly asm = LoadAssembly(nameSpace); 
  149.             Type t = asm.GetType(nameSpace); 
  150.             object o = Activator.CreateInstance(t); 
  151.             MethodInfo method = t.GetMethod(methodName); 
  152.             T result = (T)method.Invoke(o, args); 
  153.             return result; 
  154.         } 
  155.  
  156.         public T ExcuteMethod<T>(string methodName, object[] args) 
  157.         { 
  158.             string nameSpace=NameSpace; 
  159.             return ExcuteMethod<T>(methodName, nameSpace, args); 
  160.         } 
  161.  
  162.     } 

 

本文出自 “楚天雪饮” 博客,转载请与作者联系!

你可能感兴趣的:(webservice,动态)