C#动态调用webservice

因项目需求,需要调用多个webservice,因此不能使用服务引用,在网上找到一个动态调用的代码,测试可用,在此保留,以便日后再次使用

/// 根据指定的信息,调用远程WebService方法    
        /// </summary>    
        /// <param name="url">WebService的http形式的地址</param>    
        /// <param name="nameSpace">欲调用的WebService的命名空间</param>    
        /// <param name="classname">欲调用的WebService的类名(不包括命名空间前缀)</param>    
        /// <param name="methodname">欲调用的WebService的方法名</param>    
        /// <param name="args">参数列表</param>
        /// <returns>WebService的执行结果</returns>    
        private object InvokeWebservice(string url, string nameSpace, string classname, string methodname, object[] args)
        {

            try
            {

                //1.使用WebClient 下载WSDL信息
                WebClient wc = new WebClient();
                Stream stream = wc.OpenRead(url + "?WSDL");

                //2.创建和格式化WSDL文档  
                ServiceDescription srvDesc = ServiceDescription.Read(stream);

                //3. 创建客户端代理代理类  
                ServiceDescriptionImporter srvDescInporter = new ServiceDescriptionImporter();
                srvDescInporter.ProtocolName = "Soap";//指定访问协议  
                srvDescInporter.Style = ServiceDescriptionImportStyle.Client;//生成客户端代理,默认。  
                srvDescInporter.AddServiceDescription(srvDesc, "", ""); //添加WSDL文档。  

                //4 .使用 CodeDom 编译客户端代理类。
                CodeNamespace codeNamespce = new CodeNamespace(nameSpace);
                CodeCompileUnit codeCompileUnit = new CodeCompileUnit();
                codeCompileUnit.Namespaces.Add(codeNamespce);
                srvDescInporter.Import(codeNamespce, codeCompileUnit);

                CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");

                //表示用于调用编译器的参数。  
                System.CodeDom.Compiler.CompilerParameters parameter = new System.CodeDom.Compiler.CompilerParameters();
                parameter.GenerateExecutable = false;   //设置是否生成可执行文件。  
                parameter.GenerateInMemory = true;      //设置是否在内存中生成输出。  
                parameter.ReferencedAssemblies.Add("System.dll");   //ReferencedAssemblies  获取当前项目所引用的程序集。  
                parameter.ReferencedAssemblies.Add("System.XML.dll");
                parameter.ReferencedAssemblies.Add("System.Web.Services.dll");
                parameter.ReferencedAssemblies.Add("System.Data.dll");

                //获取从编译器返回的编译结果。  
                System.CodeDom.Compiler.CompilerResults cr = provider.CompileAssemblyFromDom(parameter, codeCompileUnit);
                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());
                }

                //获取已编译的程序集,然后通过反射进行动态调用。  
                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);

            }
            catch (Exception ex)
            {
                return ex.Message;
            }

        }

猜你喜欢

转载自lin358.iteye.com/blog/2344598
今日推荐