通道工厂法
除了上面提到的代理构造法能够在客户端创建代理的对象实例,我们还可以通过通道工厂的方式(ChannelFactory)来完成同样的任务。而使用通道工厂也包含如下的几种使用情况
第一种:知道服务应用程序终结点的地址和所使用的绑定方式的情况下。
第二种:只知道服务元数据终结点的地址,不知道应用程序终结点的具体情况下。
第一种:知道服务应用程序终结点的地址和所使用的绑定方式的情况下
在这种情况下,客户端所掌握的服务应用程序终结点资料比较详细,使用起来也比较方便,典型的创建方法为:
采用通道工厂的方式生成客户端服务对象实例
- /**//**//**//// <summary>
- /// 采用通道工厂的方式生成客户端服务对象实例
- /// </summary>
- /// <param name="bind"></param>
- /// <param name="address"></param>
- static void CreateClientInstanceByChannel(Binding bind, EndpointAddress address)
- {
- ChannelFactory<Proxys.IService> channelFactory = new ChannelFactory<Proxys.IService>(bind);
- var channel = channelFactory.CreateChannel(address);
- using (channel as IDisposable)
- {
- channel.DoWork();
- Wcf.Proxys.MyData myData = channel.GetData(10);
- }
- }
复制代码 这样的一种方法,给我们在调试程序的情况下,提供了更大的便利。
第二种:只知道服务元数据终结点的地址,不知道应用程序终结点的具体情况下。
在这种情况下,客户端只需要知道元数据终结点的地址,便能通过MetadataResover来获取元数据终结点对应的应用程序终结点,通过遍历应用程序终结点,还能对绑定方式进行刷选。下面的代码演示了这样一种用法。
通过MetadataResover来获取服务终结点,创建代理实例
- /**//**//**//// <summary>
- /// 已知元数据终结点,不知服务终节点,通过MetadataResover来获取服务终结点,并用通道工厂创建客户端服务实例
- /// 这种方式有个好处是不依赖服务终结点地址,数量,bind类型的情况下在客户端对服务终结点进行刷选并使用。
- /// 当然它也有缺点,那就是会比较浪费性能,最好能配合Cache来使用。
- /// </summary>
- /// <param name="address"></param>
- static void CreateClientInstanceByMetaResover(EndpointAddress address)
- {
- ServiceEndpointCollection endPoints = MetadataResolver.Resolve(typeof(Proxys.IService), address);
- foreach (ServiceEndpoint p in endPoints)
- {
- if (EndPointIsDual(p))
- {
- ChannelFactory<Proxys.IService> channelFactory = new ChannelFactory<Wcf.Proxys.IService>(p.Binding);
- Proxys.IService ws = channelFactory.CreateChannel(p.Address);
- ws.DoWork();
- Wcf.Proxys.MyData myData = ws.GetData(10);
- }
- }
- }
- static bool EndPointIsDual(ServiceEndpoint endPoint)
- {
- if (endPoint.Binding.GetType().ToString().IndexOf("Dual") > -1)
- {
- return true;
- }
- return false;
- }
复制代码 到此,我们基本上已经对客户端类生成和客户端代理对象实例的创建有了一些认识,而且通过上面的描述,也说明了在什么情况下,应该采用那种方法,如何生成代理类,如何创建代理对象实例。下面就代理构造法和通道工厂法的优劣进行一下对比:
1) 代理构造法不依赖于服务契约,服务端和客户端耦合度比较低,但创建方法比较复杂,使用方法比较单一,对于一次产生多个代理对象等应用情形比较难以应对,综合看来,更适合生产环境中使用。
2) 通道工厂法使用比较简单,也比较灵活,但依赖于服务契约,不适合生产,更适合开发调试。
本文中,讲述了WCF客户端代理对象创建技术的一些基本常识和使用技巧。下篇文章将做一步深入:如何生成元数据需要证书验证的客户端代理
最后,项目实例代码:附件: CreateClientInstanceWays.rar
|