博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
动态引用webservice
阅读量:6343 次
发布时间:2019-06-22

本文共 4888 字,大约阅读时间需要 16 分钟。

整理过后的代码

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

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

 

ExpandedBlockStart.gif
  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
 11ExpandedBlockStart.gif{
 12    public class DynamicService
 13ExpandedSubBlockStart.gif    {
 14        private static string _url = string.Empty;
 15
 16        public static string Url
 17ExpandedSubBlockStart.gif        {
 18ExpandedSubBlockStart.gif            get return _url; }
 19ExpandedSubBlockStart.gif            set { _url = value; }
 20        }
 21
 22        private static string _nameSpace = string.Empty;
 23
 24ExpandedSubBlockStart.gif        /// <summary>
 25        /// Namespace of the classes
 26        /// </summary>
 27        public static string NameSpace
 28ExpandedSubBlockStart.gif        {
 29ExpandedSubBlockStart.gif            get return _nameSpace; }
 30ExpandedSubBlockStart.gif            set { _nameSpace = value; }
 31        }
 32
 33        private static IList<string> _classNames = null;
 34
 35ExpandedSubBlockStart.gif        /// <summary>
 36        /// All classes's names
 37        /// </summary>
 38        public static IList<string> ClassNames
 39ExpandedSubBlockStart.gif        {
 40ExpandedSubBlockStart.gif            get return _classNames; }
 41            set
 42ExpandedSubBlockStart.gif            {
 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
 54ExpandedSubBlockStart.gif        /// <summary>
 55        /// Get class's instances to use in webservice
 56        /// </summary>
 57        public static IDictionary<stringobject> ClassList
 58ExpandedSubBlockStart.gif        {
 59            get
 60ExpandedSubBlockStart.gif            {
 61                IDictionary<string, Object> classNameObjList = new Dictionary<string, Object>();
 62
 63                foreach (var item in _classNames)
 64ExpandedSubBlockStart.gif                {
 65                    object instance = InvokeWebservice(item);
 66                    classNameObjList.Add(item, instance);
 67                }
 68
 69                return classNameObjList;
 70            }
 71        }
 72
 73ExpandedSubBlockStart.gif        /// <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)
 90ExpandedSubBlockStart.gif        {
 91            try
 92ExpandedSubBlockStart.gif            {
 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)
116ExpandedSubBlockStart.gif                {
117                    System.Text.StringBuilder sb = new System.Text.StringBuilder();
118                    foreach (System.CodeDom.Compiler.CompilerError ce in cr.Errors)
119ExpandedSubBlockStart.gif                    {
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)
132ExpandedSubBlockStart.gif            {
133                throw new Exception(ex.InnerException.Message, new Exception(ex.InnerException.StackTrace));
134            }
135        }
136
137ExpandedSubBlockStart.gif        /// <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)
145ExpandedSubBlockStart.gif        {
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
你可能感兴趣的文章
【14】Python100例基础练习(1)
查看>>
boost bind使用指南
查看>>
oracle高速缓存机制
查看>>
使用ntpdate更新系统时间
查看>>
Android M 特性 Doze and App Standby模式详解
查看>>
IE FF(火狐) line-height兼容详解
查看>>
谷歌Pixel 3吸引三星用户, 但未动摇iPhone地位
查看>>
python获取当前工作目录
查看>>
VUE中使用vuex,cookie,全局变量(少代码示例)
查看>>
grep -w 的解析_学习笔记
查看>>
量化交易之启航
查看>>
TX Text Control文字处理教程(3)打印操作
查看>>
CENTOS 7 如何修改IP地址为静态!
查看>>
MyCat分片算法学习(纯转)
查看>>
IO Foundation 3 -文件解析器 FileParser
查看>>
linux学习经验之谈
查看>>
mysqld_multi实现多主一从复制
查看>>
中介模式
查看>>
JS中将变量转为字符串
查看>>
servlet笔记
查看>>