动态引用webservice

简介:

整理过后的代码

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

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

 


  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<stringobject> classList = null;
 53
 54        /// <summary>
 55        /// Get class's instances to use in webservice
 56        /// </summary>

 57        public static IDictionary<stringobject> 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, truetrue);
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
欢迎加群互相学习,共同进步。QQ群:iOS: 58099570 | Android: 330987132 | Go:217696290 | Python:336880185 | 做人要厚道,转载请注明出处!http://www.cnblogs.com/sunshine-anycall/archive/2009/01/06/1370525.html
相关文章
|
8月前
|
Java
【专栏】Java反射机制,该机制允许程序在运行时获取类信息、动态创建对象、调用方法和访问属性
【4月更文挑战第27天】本文探讨了Java反射机制,该机制允许程序在运行时获取类信息、动态创建对象、调用方法和访问属性。反射通过Class、Constructor、Method和Field类实现。文中列举了反射的应用场景,如动态创建对象、调用方法、访问属性和处理注解,并提供了相关实例代码演示。
92 4
|
6月前
|
开发框架 前端开发 JavaScript
在各种开发项目中使用公用类库的扩展方法,通过上下文方式快速调用处理函数
在各种开发项目中使用公用类库的扩展方法,通过上下文方式快速调用处理函数
|
7月前
|
JSON 负载均衡 安全
对gRPC中常见的 grpc::CreateChannel()这个类所创建的对象所包含的属性做详细介绍
对gRPC中常见的 grpc::CreateChannel()这个类所创建的对象所包含的属性做详细介绍
109 0
|
8月前
|
前端开发 JavaScript
怎样使用接口引用数据
怎样使用接口引用数据
|
前端开发
WCF更新服务引用报错的原因之一
WCF更新服务引用报错的原因之一
【Groovy】MOP 元对象协议与元编程 ( Expando 动态类 | 创建动态类 | 为动态类增加字段和方法 )
【Groovy】MOP 元对象协议与元编程 ( Expando 动态类 | 创建动态类 | 为动态类增加字段和方法 )
229 0
【Groovy】MOP 元对象协议与元编程 ( Expando 动态类 | 创建动态类 | 为动态类增加字段和方法 )
|
XML 存储 Java
WebService对象调用spring注解
WebService对象调用spring注解
178 0
|
网络协议 数据处理 数据格式
艾伟_转载:Socket开发探秘--基类及公共类的定义
Socket开发是属于通信底层的开发,.NET也提供了非常丰富的类来实现Socket的开发工作,本篇不是介绍这些基础类的操作,而是从一个大的架构方面阐述Socket的快速开发工作,本篇以TCP模式进行程序的开发介绍,以期达到抛砖引玉的目的。
637 0
|
Web App开发 Android开发