动态调用ws封装类

来源:互联网 发布:淘宝供货平台 编辑:程序博客网 时间:2024/06/16 16:56
 
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Net;
  5. using System.IO;
  6. using System.Web.Services.Description;
  7. using System.CodeDom;
  8. using Microsoft.CSharp;
  9. using System.CodeDom.Compiler;
  10. namespace WWBClassLib.Tools
  11. {
  12.     public class WebServiceHelper
  13.     {
  14.         /// <summary>
  15.         /// 
  16.         /// </summary>
  17.         /// <param name="url"></param>
  18.         /// <param name="methodname"></param>
  19.         /// <param name="args"></param>
  20.         /// <returns></returns>
  21.         public static object InvokeWebService(string url, string methodname, object[] args)
  22.         {
  23.             return WebServiceHelper.InvokeWebService(url, null, methodname, args);
  24.         }
  25.         /// <summary>
  26.         /// 动态调用WebService
  27.         /// </summary>
  28.         /// <param name="url">地址</param>
  29.         /// <param name="classname">类名</param>
  30.         /// <param name="methodname">方法名</param>
  31.         /// <param name="args">参数</param>
  32.         /// <returns></returns>
  33.         public static object InvokeWebService(string url, string classname, string methodname, object[] args)
  34.         {
  35.             string @namespace = "EnterpriseServerBase.WebService.DynamicWebCalling";
  36.             if ((classname == null) || (classname == ""))
  37.             {
  38.                 //classname = DynamicWSInvoker.GetWsClassName(url);
  39.                 classname = "WebService";
  40.             }
  41.             try
  42.             {
  43.                 //获取WSDL
  44.                 WebClient wc = new WebClient();
  45.                 Stream stream = wc.OpenRead(url + "?WSDL");
  46.                 ServiceDescription sd = ServiceDescription.Read(stream);
  47.                 ServiceDescriptionImporter sdi = new ServiceDescriptionImporter();
  48.                 sdi.AddServiceDescription(sd, """");
  49.                 CodeNamespace cn = new CodeNamespace(@namespace);
  50.                 //生成客户端代理类代码
  51.                 CodeCompileUnit ccu = new CodeCompileUnit();
  52.                 ccu.Namespaces.Add(cn);
  53.                 sdi.Import(cn, ccu);
  54.                 //CSharpCodeProvider csc = new CSharpCodeProvider();
  55.                 //ICodeCompiler icc = csc.CreateCompiler();
  56.                 CodeDomProvider cdp = CodeDomProvider.CreateProvider("CSharp");
  57.                 //ICodeCompiler icc = cdp..CreateCompiler();
  58.                 
  59.                 //设定编译参数
  60.                 CompilerParameters cplist = new CompilerParameters();
  61.                 cplist.GenerateExecutable = false;
  62.                 cplist.GenerateInMemory = true;
  63.                 cplist.ReferencedAssemblies.Add("System.dll");
  64.                 cplist.ReferencedAssemblies.Add("System.XML.dll");
  65.                 cplist.ReferencedAssemblies.Add("System.Web.Services.dll");
  66.                 cplist.ReferencedAssemblies.Add("System.Data.dll");
  67.                 //编译代理类
  68.                 //CompilerResults cr = icc.CompileAssemblyFromDom(cplist, ccu);
  69.                 CompilerResults cr = cdp.CompileAssemblyFromDom(cplist, ccu);
  70.                 if (true == cr.Errors.HasErrors)
  71.                 {
  72.                     System.Text.StringBuilder sb = new System.Text.StringBuilder();
  73.                     foreach (System.CodeDom.Compiler.CompilerError ce in cr.Errors)
  74.                     {
  75.                         sb.Append(ce.ToString());
  76.                         sb.Append(System.Environment.NewLine);
  77.                     }
  78.                     throw new Exception(sb.ToString());
  79.                 }
  80.                 //生成代理实例,并调用方法
  81.                 System.Reflection.Assembly assembly = cr.CompiledAssembly;
  82.                 Type t = assembly.GetType(@namespace + "." + classname, truetrue);
  83.                 object obj = Activator.CreateInstance(t);
  84.                 System.Reflection.MethodInfo mi = t.GetMethod(methodname);
  85.                 return mi.Invoke(obj, args);
  86.             }
  87.             catch (Exception ex)
  88.             {
  89.                 throw new Exception(ex.Message.ToString());
  90.             }
  91.         }
  92.         /// <summary>
  93.         /// 
  94.         /// </summary>
  95.         /// <param name="wsUrl"></param>
  96.         /// <returns></returns>
  97.         private static string GetWsClassName(string wsUrl)
  98.         {
  99.             string[] parts = wsUrl.Split('/');
  100.             string[] pps = parts[parts.Length - 1].Split('.');
  101.             return pps[0];
  102.         }
  103.     }
  104. }
  105. 其实用这种方法应该可以写一个C#编译器,估计。
原创粉丝点击