代码动态调用webservice的类

来源:互联网 发布:网络电视机顶盒通用吗 编辑:程序博客网 时间:2024/06/13 01:10
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.Net;using System.IO;using System.Web;//需要右键添加.NET组件System.Web,System.Web.Services,System.Web.Extensions。using System.Web.Services;using System.Web.Services.Description;using System.Web.Services.Protocols;using System.Xml.Serialization;using System.CodeDom;using System.CodeDom.Compiler;using System.Reflection;namespace myWebServiceNameSpace{    class myWebServiceClass    {        /// <summary>        /// webservice返回是string的,使用该方法        /// </summary>        /// <param name="url">调用webservice的url</param>        /// <param name="className">webservice的类</param>        /// <param name="methodName">调用webservice的方法</param>        /// <param name="parameters">方法的参数</param>        /// <returns>string</returns>        public string resultString(string url, string className, string methodName, object[] parameters)        {            string resultA = "";            try            {                // 1. 使用 WebClient 下载 WSDL 信息。                WebClient client = new WebClient();                url = url + "?WSDL";                Stream stream = client.OpenRead(url);                // 2. 创建和格式化 WSDL 文档。                ServiceDescription description = ServiceDescription.Read(stream);                // 3. 创建客户端代理代理类。                ServiceDescriptionImporter importer = new ServiceDescriptionImporter();//创建客户端代理代理类。                importer.ProtocolName = "Soap"; //指定访问协议。                importer.Style = ServiceDescriptionImportStyle.Client; //生成客户端代理。                importer.CodeGenerationOptions = CodeGenerationOptions.GenerateProperties | CodeGenerationOptions.GenerateNewAsync;                importer.AddServiceDescription(description, null, null); //添加WSDL文档。                // 4. 使用 CodeDom 编译客户端代理类。                CodeNamespace nmspace = new CodeNamespace(); //命名空间                CodeCompileUnit unit = new CodeCompileUnit();                unit.Namespaces.Add(nmspace);                ServiceDescriptionImportWarnings warning = importer.Import(nmspace, unit);                CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");                CompilerParameters parameter = new CompilerParameters();                parameter.GenerateExecutable = false;                parameter.ReferencedAssemblies.Add("System.dll");                parameter.ReferencedAssemblies.Add("System.XML.dll");                parameter.ReferencedAssemblies.Add("System.Web.Services.dll");                parameter.ReferencedAssemblies.Add("System.Data.dll");                CompilerResults result = provider.CompileAssemblyFromDom(parameter, unit);                // 5. 使用 Reflection 调用 WebService。                Assembly asm = result.CompiledAssembly;                Type t = asm.GetType(className); //参数为web服务中的类名                object o = Activator.CreateInstance(t);                MethodInfo method = t.GetMethod(methodName);//参数方法名                resultA = (string)method.Invoke(o, parameters);            }            catch (Exception ex)            {                resultA = ex.ToString();            }            return resultA;        }        /// <summary>        /// webservice返回是DataSet的,使用该方法        /// </summary>        /// <param name="url">调用webservice的url</param>        /// <param name="className">webservice的类</param>        /// <param name="methodName">调用webservice的方法</param>        /// <param name="parameters">方法的参数</param>        /// <returns>DataSet</returns>        public DataSet resultDataSet(string url, string className, string methodName, object[] parameters)        {            DataSet resultA =null;            try            {                // 1. 使用 WebClient 下载 WSDL 信息。                WebClient client = new WebClient();                url = url + "?WSDL";                Stream stream = client.OpenRead(url);                // 2. 创建和格式化 WSDL 文档。                ServiceDescription description = ServiceDescription.Read(stream);                // 3. 创建客户端代理代理类。                ServiceDescriptionImporter importer = new ServiceDescriptionImporter();//创建客户端代理代理类。                importer.ProtocolName = "Soap"; //指定访问协议。                importer.Style = ServiceDescriptionImportStyle.Client; //生成客户端代理。                importer.CodeGenerationOptions = CodeGenerationOptions.GenerateProperties | CodeGenerationOptions.GenerateNewAsync;                importer.AddServiceDescription(description, null, null); //添加WSDL文档。                // 4. 使用 CodeDom 编译客户端代理类。                CodeNamespace nmspace = new CodeNamespace(); //命名空间                CodeCompileUnit unit = new CodeCompileUnit();                unit.Namespaces.Add(nmspace);                ServiceDescriptionImportWarnings warning = importer.Import(nmspace, unit);                CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");                CompilerParameters parameter = new CompilerParameters();                parameter.GenerateExecutable = false;                parameter.ReferencedAssemblies.Add("System.dll");                parameter.ReferencedAssemblies.Add("System.XML.dll");                parameter.ReferencedAssemblies.Add("System.Web.Services.dll");                parameter.ReferencedAssemblies.Add("System.Data.dll");                CompilerResults result = provider.CompileAssemblyFromDom(parameter, unit);                // 5. 使用 Reflection 调用 WebService。                Assembly asm = result.CompiledAssembly;                Type t = asm.GetType(className); //参数为web服务中的类名                object o = Activator.CreateInstance(t);                MethodInfo method = t.GetMethod(methodName);//参数方法名                resultA = (DataSet)method.Invoke(o, parameters);            }            catch (Exception ex)            {                MessageBox.Show(ex.ToString());            }            return resultA;        }    }}

以上是.cs中的代码。

        private void button3_Click(object sender, EventArgs e)        {            myWebServiceNameSpace.myWebServiceClass myWeb = new myWebServiceNameSpace.myWebServiceClass();            string url = "http://10.19.1.55/123/WebService1.asmx";            string className = "WebService1";            string methodName = "addition";            object[] parameters = new object[2];            parameters[0] = 1;            parameters[1] = 2;            double a = myWeb.resultString(url, className, methodName, parameters);            MessageBox.Show(a.ToString());                    }

以上是主程序中的代码。





原创粉丝点击