整理过后的代码

通过这个类可以将webservice提供的某个命名空间下的全部的类的实例

并可以通过invokemethod方法调用某个类的实例的方法

Code
  1using System;
  2using System.Collections.Generic;
  3using System.Linq;
  4using System.Web;
  5using System.Xml;
  6using System.Web.Services.Description;
  7using System.CodeDom;
  8using System.CodeDom.Compiler;
  9
 10namespace Ecommerce.Web.AppCode
 11{
 12    public class DynamicService
 13    {
 14        private static string _url = string.Empty;
 15
 16        public static string Url
 17        {
 18            get { return _url; }
 19            set { _url = value; }
 20        }
 21
 22        private static string _nameSpace = string.Empty;
 23
 24        /**//// <summary>
 25        /// Namespace of the classes
 26        /// </summary>
 27        public static string NameSpace
 28        {
 29            get { return _nameSpace; }
 30            set { _nameSpace = value; }
 31        }
 32
 33        private static IList<string> _classNames = null;
 34
 35        /**//// <summary>
 36        /// All classes's names
 37        /// </summary>
 38        public static IList<string> ClassNames
 39        {
 40            get { return _classNames; }
 41            set
 42            {
 43                IList<string> nameList = value;
 44
 45                if (nameList == null || nameList.Count <= 0)
 46                    throw new Exception("No class name is in the list, please check!");
 47
 48                _classNames = nameList;
 49            }
 50        }
 51
 52        private static IDictionary<string, object> classList = null;
 53
 54        /**//// <summary>
 55        /// Get class's instances to use in webservice
 56        /// </summary>
 57        public static IDictionary<string, object> ClassList
 58        {
 59            get
 60            {
 61                IDictionary<string, Object> classNameObjList = new Dictionary<string, Object>();
 62
 63                foreach (var item in _classNames)
 64                {
 65                    object instance = InvokeWebservice(item);
 66                    classNameObjList.Add(item, instance);
 67                }
 68
 69                return classNameObjList;
 70            }
 71        }
 72
 73        /**//// <summary>
 74        /// 根据指定的信息,调用远程WebService方法
 75        /// </summary>
 76        
 77        /// <param name="classname">欲调用的WebService的类名(不包括命名空间前缀)</param>
 78        /// <remarks>
 79        /// 如果调用失败,将会抛出Exception。请调用的时候,适当截获异常。
 80        /// 异常信息可能会发生在两个地方:
 81        /// 1、动态构造WebService的时候,CompileAssembly失败。
 82        /// 2、WebService本身执行失败。
 83        /// </remarks>
 84        /// <example>
 85        /// <code>
 86        /// object obj = InvokeWebservice("http://localhost/GSP_WorkflowWebservice/common.asmx","Genersoft.Platform.Service.Workflow","Common","GetToolType",new object[]{"1"});
 87        /// </code>
 88        /// </example>
 89        public static object InvokeWebservice(string classname)
 90        {
 91            try
 92            {
 93                System.Net.WebClient wc = new System.Net.WebClient();
 94                System.IO.Stream stream = wc.OpenRead(_url + "?WSDL");
 95                System.Web.Services.Description.ServiceDescription sd = System.Web.Services.Description.ServiceDescription.Read(stream);
 96                System.Web.Services.Description.ServiceDescriptionImporter sdi = new System.Web.Services.Description.ServiceDescriptionImporter();
 97                sdi.AddServiceDescription(sd, "", "");
 98                System.CodeDom.CodeNamespace cn = new System.CodeDom.CodeNamespace(_nameSpace);
 99                System.CodeDom.CodeCompileUnit ccu = new System.CodeDom.CodeCompileUnit();
100                ccu.Namespaces.Add(cn);
101                sdi.Import(cn, ccu);
102
103                Microsoft.CSharp.CSharpCodeProvider csc = new Microsoft.CSharp.CSharpCodeProvider();
104                System.CodeDom.Compiler.ICodeCompiler icc = csc.CreateCompiler();
105
106                System.CodeDom.Compiler.CompilerParameters cplist = new System.CodeDom.Compiler.CompilerParameters();
107                cplist.GenerateExecutable = false;
108                cplist.GenerateInMemory = true;
109                cplist.ReferencedAssemblies.Add("System.dll");
110                cplist.ReferencedAssemblies.Add("System.XML.dll");
111                cplist.ReferencedAssemblies.Add("System.Web.Services.dll");
112                cplist.ReferencedAssemblies.Add("System.Data.dll");
113
114                System.CodeDom.Compiler.CompilerResults cr = icc.CompileAssemblyFromDom(cplist, ccu);
115                if (true == cr.Errors.HasErrors)
116                {
117                    System.Text.StringBuilder sb = new System.Text.StringBuilder();
118                    foreach (System.CodeDom.Compiler.CompilerError ce in cr.Errors)
119                    {
120                        sb.Append(ce.ToString());
121                        sb.Append(System.Environment.NewLine);
122                    }
123                    throw new Exception(sb.ToString());
124                }
125                System.Reflection.Assembly assembly = cr.CompiledAssembly;
126                Type t = assembly.GetType(_nameSpace + "." + classname, true, true);
127                object obj = Activator.CreateInstance(t);
128
129                return obj;
130            }
131            catch (Exception ex)
132            {
133                throw new Exception(ex.InnerException.Message, new Exception(ex.InnerException.StackTrace));
134            }
135        }
136
137        /**//// <summary>
138        /// Invoke the method in this class by specifying the method name
139        /// </summary>
140        /// <param name="classInstance"></param>
141        /// <param name="functionName"></param>
142        /// <param name="args"></param>
143        /// <returns></returns>
144        public static object InvokeMethod(object classInstance, string functionName,object[] args)
145        {
146            System.Reflection.MethodInfo mi = classInstance.GetType().GetMethod(functionName);
147            return mi.Invoke(classInstance, args);
148        }
149    }
150}
151

动态引用webservice相关推荐

  1. vue 调用webservice_用C#通过反射实现动态调用WebService 告别Web引用(转载)

    我们都知道,调用WebService可以在工程中对WebService地址进行WEB引用,但是这确实很不方便.我想能够利用配置文件灵活调用WebService.如何实现呢? 用C#通过反射实现动态调用 ...

  2. C# 动态调用WebService

    Reference from : http://blog.csdn.net/chuxiamuxiang/article/details/5731988 在C#程序中,若要调用WebService,一般 ...

  3. 使用AOP动态调用WebService

    在网上搜了一下"动态调用WebService"相信都能搜出上千篇文章,但是都出自同一个版本:使用ServiceDescriptionImporter导入wsdl然后进行动态编译,再 ...

  4. Silverlight 动态调用 WebService

    1. 配置 IIS 绑定 IP地址 2. 在 SL 中引用 WebService 3. 在需要调用 WebService 的地方写下列代码: WCF : WCF  BasicHttpBinding b ...

  5. .NET动态调用WebService

    这不是一篇教你了解WebService的博文,也不是对WebService的深入理解, 这是一篇教你在开发过程中,如果动态的调用WebService一个方法. 在比较常见的WebService调用,我 ...

  6. vue 调用webservice_动态调用WebService接口的几种方式

    一.什么是WebService? 这里就不再赘述了,想要了解的====>传送门 二.为什么要动态调用WebService接口? 一般在C#开发中调用webService服务中的接口都是通过引用过 ...

  7. 动态创建WebService

    WebService应用主要是为远程提供接口服务,远程通过代理方式获取WebService资源:但是在现实应用过程中,在Web或者应用程序中如果想用生成远程代理,一般是借助vs里提供的 添加-添加we ...

  8. Android开发技巧--Application, ListView排列,格式化浮点数,string.xml占位符,动态引用图片...

    一. Application用途 1. Application用途 创建Application时机 : Application在启动的时候会调用Application无参的构造方法创建实例; Appl ...

  9. C# 动态调用webservice代码

    /// <summary> /// 动态调用WebService /// </summary> /// <param name="url">UR ...

最新文章

  1. 数据库jdbc property文件配置信息片段
  2. 知名大学4篇学术论文被撤!校方:已做相关取证!
  3. swift语言注册非免费苹果账号iOS游戏框架Sprite Kit基础教程
  4. centos7 ambari2.6.1.5+hdp2.6.4.0 大数据集群安装部署
  5. 曾经安全难为智 除却山石不是云——山石网科举办2016年度金融用户峰会
  6. C++ Primer 5th笔记(chap 16 模板和泛型编程)转发
  7. php mysql 字段备注_MySQL下读取 表/字段 的说明备注信息
  8. mdAAPP:安装后会一直存在手机中,安装数据及缓存都会占用大量内存,而且各家全家桶APP之间都有一些藕断丝连的唤醒关系。 小程序:不需要安装在手机上,微信有严格的小程序内存管理机制,和微信共用内存使
  9. Win7 访问共享时输入正确密码仍然提示密码错误
  10. 仅使用NumPy完成卷积神经网络CNN的搭建(附Python代码)
  11. Lync Server 2013企业版部署系列之三:CA准备
  12. 脉脉第一干货贴,互联网职场那点事,关于面试、绩效、晋升、职业规划。
  13. mybatis基础总结01
  14. linux系统同时安装python2.x和3.x
  15. matlab低通滤波器库函数代码_【转】Matlab中模拟低通滤波器的函数
  16. matlab俄罗斯方块
  17. 听说股票是暴利?花了一晚上时间,用Python写了个股票提醒系统
  18. Python 斐波那契数列 及 杨辉三角
  19. STM32F407ZGT6引脚功能
  20. GPRS网络组成及接口

热门文章

  1. 【Linux】vim简单配置
  2. c++ 特定容器算法(sort,merge,reverse,remove,unique)
  3. java如何做数据归档_oracle数据库的归档方式
  4. 海思Hi3516DV300 SDK首次安装以及编译问题的解决
  5. 5G NR 随机接入过程(1)
  6. MongoDB分布式操作——分片操作
  7. context:component-scan/和mvc:annotation-driven/的区别
  8. Cocoa/iPhone App/静态库 嵌入资源文件 rtb v0.1发布
  9. CentOS下开启配置端口转发
  10. UVA-10285 Longest Run on a Snowboard (递推)