新文章 网摘 文章 随笔 日记

WebServiceHelper

    public class WebServiceHelper
    {
        /// <summary>
        /// CALL WebService
        /// </summary>
        /// <param name="url">WebService地址</param>
        /// <param name="nameSpace">命名空間</param> 
        /// <param name="className">類名</param>
        /// <param name="methodName">方法名</param>
        /// <param name="age">參數</param>
        /// <returns></returns>
        public static string CallWebService(string url,string nameSpace, string className, string methodName, string[] age)
        {
            WebClient web = new WebClient();
            Stream stream = web.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();

            //设定编译参数
            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 = csc.CompileAssemblyFromDom(cplist, ccu);
            if (cr.Errors.HasErrors == true)
            {
                StringBuilder sb = new StringBuilder();
                foreach (CompilerError ce in cr.Errors)
                {
                    sb.Append(ce.ToString());
                    sb.Append(Environment.NewLine);
                }
                throw new Exception(sb.ToString());
            }

            //生成代理实例,并调用方法
            Assembly assembly = cr.CompiledAssembly;
            Type t = assembly.GetType(nameSpace + "." + className, true, true);
            object obj = Activator.CreateInstance(t);

            MethodInfo mi = t.GetMethod(methodName);
            object value = mi.Invoke(obj, age);
            return value.ToString();
        }
    }

 

posted @ 2021-03-10 10:27  岭南春  阅读(200)  评论(0)    收藏  举报