该方法可以使程序不通过web引用的方式去调用webservices方法,直接在代码里调用该方法就能达到动态调用webservices的目的。使用前先引用System.Web.Services动态链接库,是.net自带的dll。

方法如下:

using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.IO;
using System.Web.Services.Description;
using System.CodeDom;
using Microsoft.CSharp;
using System.CodeDom.Compiler;

namespace TestSkin
{
    class Webservices
    {
        /// <summary>
        /// 实例化WebServices
        /// </summary>
        /// <param name="url">WebServices地址</param>
        /// <param name="methodname">调用的方法</param>
        /// <param name="args">把webservices里需要的参数按顺序放到这个object[]里</param>
        public static object InvokeWebService(string url, string methodname, object[] args)
        {

//这里的namespace是需引用的webservices的命名空间,在这里是写死的,大家可以加一个参数从外面传进来。
            string @namespace = "client";
            try
            {
                //获取WSDL
                WebClient wc = new WebClient();
                Stream stream = wc.OpenRead(url + "?WSDL");
                ServiceDescription sd = ServiceDescription.Read(stream);
                string classname = sd.Services[0].Name;
                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();
                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());
                }

//生成代理实例,并调用方法
                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
            {
                return null;
            }
        }
    }
}

转载于:https://www.cnblogs.com/ruochen/archive/2007/12/11/990427.html

通过反射动态调用webservices相关推荐

  1. (C#)利用反射动态调用类成员[转载]

    使用反射动态调用类成员,需要Type类的一个方法:InvokeMember.对该方法的声明如下(摘抄于MSDN): public object InvokeMember(    string name ...

  2. 利用反射动态调用类成员C#

    使用反射动态调用类成员,需要Type类的一个方法:InvokeMember.对该方法的声明如下(摘抄于MSDN): public object InvokeMember(    string name ...

  3. C# 利用反射动态调用类成员

    使用反射动态调用类成员,需要Type类的一个方法:InvokeMember.对该方法的声明如下: public object InvokeMember( string name, BindingFla ...

  4. 反射动态调用DLL类库测试

    定义:可以在运行时获得.NET中每一个类型(包括类.结构.委托.接口和枚举等)的成员,包括方法.属性.事件,以及构造函数等.还可以获得每个成员的名称.限定符和参数等.有了反射,即可对每一个类型了如指掌 ...

  5. C# 知识点笔记:IEnumerable的使用,利用反射动态调用方法

    IEnumerable<T>的使用 创建一个IEnumerable对象 List<string> fruits = new List<string> { " ...

  6. 通过.NET反射动态调用SetValue方法给属性PropertyInfo动态类型赋值

    注意:若不动态转换属性的值,简单调用SetValue方法赋值经常出错!特别是日期类型.带符号的数字类型等. 解决方案: 通过TypeDescriptor.GetConverter方法获取对应数值类型的 ...

  7. 如何动态调用WebServices

    我们都知道,调用WS可以在工程中添加对WS的WEB引用. 但是,如果我们不想通过添加引用的方式,而是在代码中动态引用该怎么办呢? 首先,我们该想到WS的实现也是一个类的形式. 其次,WS在传输过程中是 ...

  8. 利用.Net中的反射动态调用方法

    .Net中的反射功能是极其强大的,本篇先用他来动态调用方法 看如下一个类 Public Class A { public void InvokeMethod(string methodname) { ...

  9. java反射 动态调用_java反射拼接方法名动态执行方法

    近期由于负责项目的一个模块,该模块下有很多分类,每个分类都有一个编码code,这个值是作为一个参数携带过来的.但是每个code确实对应一个方法的. code的值有很多个,自己又不想做ifelse或者s ...

最新文章

  1. python中if else语句用法_讲解Python中if语句的嵌套用法
  2. 【c语言】蓝桥杯算法提高 JOE的算数
  3. Data source rejected establishment of connection, message from server: Too many connections
  4. 【CodeIgniter 】解惑
  5. windows mongdb 安装
  6. Ubuntu18.04 可用字体库
  7. 在Dreamweaver中安装Emmet(zen-coding)
  8. 牛客网 链表结构 算法相关内容
  9. 【uoj#174】新年的破栈 贪心
  10. 安装、配置文件-配置 CACTI 监控 MySQL 数据库状态-by小雨
  11. SysTick系统定时器(功能框图和优先级配置)
  12. Atitit.软件gui按钮and面板---os区-----linux windows搜索文件 文件夹
  13. Linux 下载GCC
  14. ECshop新手入门模板制作教程[转载]
  15. MySQL基础知识,入门必备
  16. 计算机的标点符号有哪些,电脑标点符号怎么打出来,四个电脑小技巧轻松输入各种符号...
  17. 中文和英语中主语、谓语、宾语、定语、状语、补语的定义
  18. 计算所汉语词性标记集
  19. win10家庭版系统升级
  20. HTML期末学生大作业-节日网页作业html+css+javascript

热门文章

  1. 你一定会用的18个linux网络监控工具
  2. 华为HCIE RS都考什么?(含选择及面试题)
  3. Java 线上问题排查神器 Arthas 快速上手与原理浅谈
  4. 电脑硬件知识学习_DIY电脑多年,这些硬件冷知识你们知道吗?
  5. java表单上下左右滚动_怎么在网页中实现表格上下左右滚动
  6. pomelo php,Nginx 502 Bad Gateway 自动重启shell脚本
  7. java jdom格式_Java全面解析XML格式串(JDOM解析)
  8. java 怎么向串口发送指令_idea ssm项目java程序使用十六进制rxtx包向串口发送指令的方法...
  9. 计算机视觉,图像处理 经典代码paper整理(很全很强大!)
  10. MeanShift 目标跟踪