动态调用WebService

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

namespace IBO.XJMYQP.Utility
{
    public class WebServiceInvoke
    {
        public static object InvokeWebService(string url, string methodname)
        {
            return InvokeWebService("", url, null, methodname, null);
        }

        public static object InvokeWebService(string url, string methodname, object[] args)
        {
            return InvokeWebService("", url, null, methodname, args);
        }

        public static object InvokeWebService(string nameSpace, string url, string methodname, object[] args)
        {
            return InvokeWebService(nameSpace, url, null, methodname, args);
        }

        public static object InvokeWebService(string nameSpace, string url, string classname, string methodname, object[] args)
        {
            string @namespace = nameSpace;
            if ((classname == null) || (classname == ""))
            {
                classname = GetWsClassName(url);
            }

            try
            {
                //获取WSDL
                WebClient wc = new WebClient();
                Stream stream = wc.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();
                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 (Exception ex)
            {
                throw new Exception(ex.InnerException.Message, new Exception(ex.InnerException.StackTrace));
            }
        }

        private static string GetWsClassName(string wsUrl)
        {
            string[] parts = wsUrl.Split('/');
            string[] pps = parts[parts.Length - 1].Split('.');

            return pps[0];
        }
    }
}

调用:

 WebServiceInvoke.InvokeWebService(url, "GetServiceStatus");

其他博客:

http://linglong117.blog.163.com/blog/static/277145472009127514463/

http://blog.csdn.net/gdjlc/article/details/8560405

另外一种动态方式: 记录一个.net平台下动态调用webservice的处理类(动态编辑请求soap信息)

实质上就是基于Http get/post请求来调用webservice

http://blog.csdn.net/cyf_cyf/article/details/7197021

C#动态调用webservice方法

http://www.cnblogs.com/wuyifu/p/3297938.html

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Jquery ajax传递复杂参数给WebService

    http://www.cnblogs.com/kingge/archive/2011/08/04/2127642.html

    跟着阿笨一起玩NET
  • 在RichTextBox中对关键字进行高亮显示

    若要实现更复杂的功能,可以研究一下这个C#的IDE编辑器的代码。http://www.icsharpcode.net/OpenSource/SD/Defaul...

    跟着阿笨一起玩NET
  • 获取MDI窗体的实例

               //检查指定MDI窗体的实例是否存在。             IsExistInstance(this, typeof(WindowsF...

    跟着阿笨一起玩NET
  • c#展BOM (BAAN的表结构)

    前几天在report script写展BOM的程序,怎么也没写出来。回上海后,用C#写了一个。但是还不够完善,希望有兴趣的继续写下去。

    Tony老师
  • Golang语言 -并行程序

    go在设计的时候,就有针对并行的语法 —-channel 和goroutine 前者 可以很方便的进行消息和数据传递,在取数据和拿数据的时候可以不用关心底层实现...

    李海彬
  • 数据加密技术之MD5加密

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明...

    bering
  • 数据访问模式之Repository模式

    数据访问层无非就是对数据进行增删改查,其中增、删、改等我们可以抽象出来写一个公共的接口或抽象类来定义这些方法,并采用一个基类实现这些方法,这样该基类派生的子类都...

    写代码的猿
  • 张一鸣发牢骚,马化腾硬气回应,俞永福却支持!TT大战一触即发?

    张一鸣宣布“庆祝一个小的胜利”,一季度,抖音(国际版名为Tik Tok)在App Store的全球下载量达到第一,超过了Youtube、WeChat诸多平台。张...

    罗超频道
  • 【Java小工匠聊高并发】--CountDownLatch

      在讲CountDownLatch的应用场景之前,我们先在现实生活中,找到一个对应的场景。例如班主任带一帮孩子去春游,春游回家前,班主任需要清点人数,确保每个...

    Java小工匠
  • Find 查找命令时过滤掉某些文件或目录 以及 -maxdepth、-mindepth的用法

    1)find过滤目录 使用find命令在linux系统中查找文件时,有时需要忽略某些目录,可以使用"-path 过滤的目录路径 -prune -o"参数来进行过...

    洗尽了浮华

扫码关注云+社区

领取腾讯云代金券