代码动态调用webservice的类

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

以上是主程序中的代码。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值