动态引用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<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相关推荐
- vue 调用webservice_用C#通过反射实现动态调用WebService 告别Web引用(转载)
我们都知道,调用WebService可以在工程中对WebService地址进行WEB引用,但是这确实很不方便.我想能够利用配置文件灵活调用WebService.如何实现呢? 用C#通过反射实现动态调用 ...
- C# 动态调用WebService
Reference from : http://blog.csdn.net/chuxiamuxiang/article/details/5731988 在C#程序中,若要调用WebService,一般 ...
- 使用AOP动态调用WebService
在网上搜了一下"动态调用WebService"相信都能搜出上千篇文章,但是都出自同一个版本:使用ServiceDescriptionImporter导入wsdl然后进行动态编译,再 ...
- Silverlight 动态调用 WebService
1. 配置 IIS 绑定 IP地址 2. 在 SL 中引用 WebService 3. 在需要调用 WebService 的地方写下列代码: WCF : WCF BasicHttpBinding b ...
- .NET动态调用WebService
这不是一篇教你了解WebService的博文,也不是对WebService的深入理解, 这是一篇教你在开发过程中,如果动态的调用WebService一个方法. 在比较常见的WebService调用,我 ...
- vue 调用webservice_动态调用WebService接口的几种方式
一.什么是WebService? 这里就不再赘述了,想要了解的====>传送门 二.为什么要动态调用WebService接口? 一般在C#开发中调用webService服务中的接口都是通过引用过 ...
- 动态创建WebService
WebService应用主要是为远程提供接口服务,远程通过代理方式获取WebService资源:但是在现实应用过程中,在Web或者应用程序中如果想用生成远程代理,一般是借助vs里提供的 添加-添加we ...
- Android开发技巧--Application, ListView排列,格式化浮点数,string.xml占位符,动态引用图片...
一. Application用途 1. Application用途 创建Application时机 : Application在启动的时候会调用Application无参的构造方法创建实例; Appl ...
- C# 动态调用webservice代码
/// <summary> /// 动态调用WebService /// </summary> /// <param name="url">UR ...
最新文章
- 数据库jdbc property文件配置信息片段
- 知名大学4篇学术论文被撤!校方:已做相关取证!
- swift语言注册非免费苹果账号iOS游戏框架Sprite Kit基础教程
- centos7 ambari2.6.1.5+hdp2.6.4.0 大数据集群安装部署
- 曾经安全难为智 除却山石不是云——山石网科举办2016年度金融用户峰会
- C++ Primer 5th笔记(chap 16 模板和泛型编程)转发
- php mysql 字段备注_MySQL下读取 表/字段 的说明备注信息
- mdAAPP:安装后会一直存在手机中,安装数据及缓存都会占用大量内存,而且各家全家桶APP之间都有一些藕断丝连的唤醒关系。 小程序:不需要安装在手机上,微信有严格的小程序内存管理机制,和微信共用内存使
- Win7 访问共享时输入正确密码仍然提示密码错误
- 仅使用NumPy完成卷积神经网络CNN的搭建(附Python代码)
- Lync Server 2013企业版部署系列之三:CA准备
- 脉脉第一干货贴,互联网职场那点事,关于面试、绩效、晋升、职业规划。
- mybatis基础总结01
- linux系统同时安装python2.x和3.x
- matlab低通滤波器库函数代码_【转】Matlab中模拟低通滤波器的函数
- matlab俄罗斯方块
- 听说股票是暴利?花了一晚上时间,用Python写了个股票提醒系统
- Python 斐波那契数列 及 杨辉三角
- STM32F407ZGT6引脚功能
- GPRS网络组成及接口
热门文章
- 【Linux】vim简单配置
- c++ 特定容器算法(sort,merge,reverse,remove,unique)
- java如何做数据归档_oracle数据库的归档方式
- 海思Hi3516DV300 SDK首次安装以及编译问题的解决
- 5G NR 随机接入过程(1)
- MongoDB分布式操作——分片操作
- context:component-scan/和mvc:annotation-driven/的区别
- Cocoa/iPhone App/静态库 嵌入资源文件 rtb v0.1发布
- CentOS下开启配置端口转发
- UVA-10285 Longest Run on a Snowboard (递推)