备忘——动态调用webservice的helper类

using System;

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;

using System.Collections;

using System.Reflection;


namespace Yeage.MMS.Channels
{
    public class WebServiceHelper
    {
        private string @namespace = "DynamicWebCalling";                 //命名空间  

        private Assembly assembly = null;         //程序集;  

        private string classname = string.Empty;     //类名称;  

        private Type t;                           //表示类型;  

        private object obj = null;               //表示实例;  

        private Boolean isSuccess = false;       //是否创建实例成功;  

 

 

        public WebServiceHelper(string Url, string classname)
        {

            if (classname == null || classname == string.Empty)

                this.classname = GetWsClassName(Url);

            else

                this.classname = classname;

 

            try
            {

                //获取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);

                stream.Close();

 

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

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

                }

 

                assembly = cr.CompiledAssembly;

            }

            catch (System.Exception ex)
            {

                throw new Exception(ex.InnerException.Message, new Exception(ex.InnerException.StackTrace));

            }

        }

 

        private Boolean CreateInstance()
        {

            try
            {

                t = assembly.GetType(@namespace + "." + classname, true, true);

                obj = Activator.CreateInstance(t);

                isSuccess = true;

            }

            catch (System.Exception e)
            {

                throw new Exception(e.Message);

            }

            return isSuccess;

        }

 

        public object InvokeWebService(string methodanme, object[] parms)
        {

 

            if (!isSuccess)
            {

                CreateInstance();

            }

 

            try
            {

                System.Reflection.MethodInfo mi = t.GetMethod(methodanme);
                               

                return mi.Invoke(obj, parms);

 

            }

            catch (System.Exception ex)
            {

                throw new Exception(ex.InnerException.Message, new Exception(ex.InnerException.StackTrace));

            }

 

        }

 

        private string GetWsClassName(string wsUrl)
        {

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

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

 

            return pps[0];

        }

 

    }
}

posted on 2009-06-03 14:09  wanghy79  阅读(528)  评论(0)    收藏  举报