WebServeice 动态代理类
1, webservice是什么?
是一个平台独立的,低耦合的,自包含的、基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述、发布、发现、协调和配置这些应用程序,用于开发分布式的互操作的应用程序。
2, webservice可以用来做什么?
能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件, 就可相互交换数据或集成。依据Web Service规范实施的应用之间, 无论它们所使用的语言、 平台或内部协议是什么, 都可以相互交换数据。Web Service是自描述、 自包含的可用网络模块, 可以执行具体的业务功能。Web Service也很容易部署, 因为它们基于一些常规的产业标准以及已有的一些技术,诸如标准通用标记语言下的子集XML、HTTP。Web Service减少了应用接口的花费。Web Service为整个企业甚至多个组织之间的业务流程的集成提供了一个通用机制。
3, webservice怎么用?
方式一:直接添加服务引用 优点,简单粗暴,直接开干,缺点:服务引用地址更改后,则需要更改相应的源码,相应测试,发布。维护不方便。
方式二:WebService 动态代理类,优点:webservice 可进行配置,有更改时只需要更改相应配置文件即可,无需更改源码;缺点:其实没得啥子缺点,就是要把这个服务类放进项目中而已。代码多了点而已。代理类代码如下
1 /// <summary>
2 /// webservice动态代理类
3 /// </summary>
4 public class WebServiceAgentUtil
5 {
6 /// <summary>
7 /// 自定义一个代码空间
8 /// </summary>
9 private const string CODE_NAMESPACE = "Application.WebServiceAgent.Dynamic";
10
11 private string _url;
12
13 private object _agent;
14
15 private Type _serviceType;
16
17 /// <summary>
18 /// 初始化webservice代理
19 /// </summary>
20 /// <param name="url"></param>
21 public WebServiceAgentUtil(string url)
22 {
23 _url = url;
24 InitializeDynamicAgent();
25 }
26
27 /// <summary>
28 /// 生产代理实例
29 /// </summary>
30 private void InitializeDynamicAgent()
31 {
32 try
33 {
34 //获取WSDL
35 var wc = new WebClient();
36 var stream = wc.OpenRead(_url + "?WSDL");
37 var sd = ServiceDescription.Read(stream);
38 var classname = sd.Services[0].Name;
39 var sdi = new ServiceDescriptionImporter();
40 sdi.AddServiceDescription(sd, "", "");
41 var cn = new CodeNamespace(CODE_NAMESPACE);
42
43 //生成客户端代理类代码
44 var ccu = new CodeCompileUnit();
45 ccu.Namespaces.Add(cn);
46 sdi.Import(cn, ccu);
47 var csc = new CSharpCodeProvider();
48
49 //设定编译参数
50 var cplist = new CompilerParameters
51 {
52 GenerateExecutable = false,
53 GenerateInMemory = true
54 };
55 cplist.ReferencedAssemblies.Add("System.dll");
56 cplist.ReferencedAssemblies.Add("System.XML.dll");
57 cplist.ReferencedAssemblies.Add("System.Web.Services.dll");
58 cplist.ReferencedAssemblies.Add("System.Data.dll");
59
60 //编译代理类
61 var cr = csc.CompileAssemblyFromDom(cplist, ccu);
62 if (cr.Errors.HasErrors)
63 {
64 var sb = new StringBuilder();
65 foreach (CompilerError ce in cr.Errors)
66 {
67 sb.Append(ce.ToString());
68 sb.Append(Environment.NewLine);
69 }
70 throw new Exception(sb.ToString());
71 }
72
73 //生成代理实例
74 var assembly = cr.CompiledAssembly;
75 _serviceType = assembly.GetType(CODE_NAMESPACE + "." + classname, true, true);
76 _agent = Activator.CreateInstance(_serviceType);
77 }
78 catch
79 {
80 return;
81 }
82 }
83
84 /// <summary>
85 /// 调用webservice方法
86 /// </summary>
87 /// <param name="methodname">方法名</param>
88 /// <param name="args">参数列表</param>
89 /// <returns></returns>
90 public object InvokeWebService(string methodname, object[] args)
91 {
92 var mi = _serviceType.GetMethod(methodname);
93 return mi.Invoke(_agent, args);
94 }
95 }
调用方式(代码如下):
1 string url = "webservice 所在地址,此可配置在config文件中";
2 //初始化webservice 代理类
3 var wc = new WebServiceAgentUtil(url);
4 //调用webservice
5 //定义参数数组
6 var arr = new object[] { };
7 //obj 为调用后返回结果集
8 var obj = wc.InvokeWebService("webservice方法名(大小写匹配)", arr);
来自一个孤独汉子内心的独白!!


浙公网安备 33010602011771号