WebServiceHelper类

using System;  


 using System.Collections.Generic;  

 using System.Text;  

    

 using System.IO;  

 using System.Configuration;  

 using System.CodeDom;  

 using System.CodeDom.Compiler;  

 using System.Net;  

 using System.Web.Services;  

 using System.Web.Services.Description;  

 using Microsoft.CSharp;  

    

 namespace InvokeWebService  

 {  

     public static class WebServiceHelper  

     {  

         /// <summary>  

         /// 动态调用WebService  

         /// </summary>  

         /// <param name="url">WebService地址</param>  

         /// <param name="methodname">方法名(模块名)</param>  

         /// <param name="args">参数列表</param>  

         /// <returns>object</returns>  

         public static object InvokeWebService(string url, string methodname, object[] args)  

         {  

             return InvokeWebService(url, null, methodname, args);  

         }  

         /// <summary>  

         /// 动态调用WebService  

         /// </summary>  

         /// <param name="url">WebService地址</param>  

         /// <param name="classname">类名</param>  

         /// <param name="methodname">方法名(模块名)</param>  

         /// <param name="args">参数列表</param>  

         /// <returns>object</returns>  

         public static object InvokeWebService(string url, string classname, string methodname, object[] args)  

         {  

             string @namespace = "ServiceBase.WebService.DynamicWebLoad";  

             if (classname == null || classname == "")  

             {  

                 classname = WebServiceHelper.GetClassName(url);  

             }  

             //获取服务描述语言(WSDL)  

             WebClient wc = new WebClient();  

             Stream stream = wc.OpenRead(url + "?WSDL");  

             ServiceDescription sd = ServiceDescription.Read(stream);  

             ServiceDescriptionImporter sdi = new ServiceDescriptionImporter();  

             sdi.AddServiceDescription(sd, "", "");  

             CodeNamespace cn = new CodeNamespace(@namespace);  

             //生成客户端代理类代码  

             CodeCompileUnit ccu = new CodeCompileUnit();  

             ccu.Namespaces.Add(cn);  

             sdi.Import(cn, ccu);  

             CSharpCodeProvider csc = new CSharpCodeProvider();  

             ICodeCompiler icc = csc.CreateCompiler();  

             //设定编译器的参数  

             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 cr = icc.CompileAssemblyFromDom(cplist, ccu);  

             if (true == cr.Errors.HasErrors)  

             {  

                 System.Text.StringBuilder sb = new StringBuilder();  

                 foreach (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);  

    

         }  

    

         private static string GetClassName(string url)  

         {  

            string[] parts = url.Split('/');  

        string[] pps = parts[parts.Length - 1].Split('.');  

            return pps[0];  

        }  

     }  

 } 


 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值