您的位置:首页 > 其它

WCF生成客户端对象方式解析

2008-07-26 18:32 218 查看
在WCF中有两种不同的方法可以用于创建客户端服务对象,他们分别为:

1. 代理构造法

2. 通道工厂法

本文会从实际应用的角度上,阐述两种方法的一些细节和优劣对比,希望通过学习本文,能掌握什么情况下使用什么样的方式来创建客户端服务代理对象,怎样创建客户端代理对象。本文重点在术,非道。

构造代理法

从名字中可以看出,使用本方法创建客户端服务代理对象,是调用了服务代理类的构造方法。这种方法非常符合创建对象的常规方法:通过new的方式产生类型实例。可在WCF中要使用此方法,却是需要一个前提:要首先具备代理类。所以产生代理类便是此种方法首先要解决的问题了,下面就来看下WCF中创建代理类的几种常见办法。

在WCF中,创建代理类,可以分为下面的几种情况:

第一种:知道服务元数据地址,通过在项目中添加服务引用。

第二种:知道服务元数据地址,通过svcutil.exe生成代理类和配置文件。

第三种:从服务契约所在的的程序集(dll,exe)中导出元数据,然后从本地元数据生成代理类。

第四种:知道元数据的地址,通过自定义的代码生成代理类。

下面分别详细的阐述四种方法的操作过程

第一种:知道服务元数据地址,通过在项目中添加服务引用。

这种方法非常适合初学者,生成代理类的难度基本为0,也是这几种生成方式中最为简单的。但前提必须事先知道元数据的发布地址。下面是操作过程:

在项目中单击右键,选择添加服务引用

public ServiceClient()

public ServiceClient(string endpointConfigurationName) :

base(endpointConfigurationName)

public ServiceClient(string endpointConfigurationName, string remoteAddress) :

base(endpointConfigurationName, remoteAddress)

public ServiceClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) :

base(endpointConfigurationName, remoteAddress)

public ServiceClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) :

base(binding, remoteAddress)

而如果服务中有双工Duplex,那么服务的代理类将不再继承System.ServiceModel.ClientBase<IService>,而是更改为:System.ServiceModel.DuplexClientBase<IDuplexService>,而且他的构造也会变成如下的四个:

public DuplexServiceClient(System.ServiceModel.InstanceContext callbackInstance) :

base(callbackInstance)

public DuplexServiceClient(System.ServiceModel.InstanceContext callbackInstance, string endpointConfigurationName) :

base(callbackInstance, endpointConfigurationName)

public DuplexServiceClient(System.ServiceModel.InstanceContext callbackInstance, string endpointConfigurationName, string remoteAddress) :

base(callbackInstance, endpointConfigurationName, remoteAddress)

public DuplexServiceClient(System.ServiceModel.InstanceContext callbackInstance, string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) :

base(callbackInstance, endpointConfigurationName, remoteAddress)

public DuplexServiceClient(System.ServiceModel.InstanceContext callbackInstance, System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) :

base(callbackInstance, binding, remoteAddress)

通过调用上面代理类中任意的构造函数重载,都能创建客户端服务代理对象实例。具体使用方法可见实例项目Wcf.Client中的代码

通道工厂法

除了上面提到的代理构造法能够在客户端创建代理的对象实例,我们还可以通过通道工厂的方式(ChannelFactory)来完成同样的任务。而使用通道工厂也包含如下的几种使用情况

第一种:知道服务应用程序终结点的地址和所使用的绑定方式的情况下。

第二种:只知道服务元数据终结点的地址,不知道应用程序终结点的具体情况下。

第一种:知道服务应用程序终结点的地址和所使用的绑定方式的情况下

在这种情况下,客户端所掌握的服务应用程序终结点资料比较详细,使用起来也比较方便,典型的创建方法为:

static void CreateClientInstanceByChannel(Binding bind, EndpointAddress address)

这样的一种方法,给我们在调试程序的情况下,提供了更大的便利。

第二种:只知道服务元数据终结点的地址,不知道应用程序终结点的具体情况下。

在这种情况下,客户端只需要知道元数据终结点的地址,便能通过MetadataResover来获取元数据终结点对应的应用程序终结点,通过遍历应用程序终结点,还能对绑定方式进行刷选。下面的代码演示了这样一种用法。

static void CreateClientInstanceByMetaResover(EndpointAddress address)

static bool EndPointIsDual(ServiceEndpoint endPoint)

到此,我们基本上已经对客户端类生成和客户端代理对象实例的创建有了一些认识,而且通过上面的描述,也说明了在什么情况下,应该采用那种方法,如何生成代理类,如何创建代理对象实例。下面就代理构造法和通道工厂法的优劣进行一下对比:

1) 代理构造法不依赖于服务契约,服务端和客户端耦合度比较低,但创建方法比较复杂,使用方法比较单一,对于一次产生多个代理对象等应用情形比较难以应对,综合看来,更适合生产环境中使用。

2) 通道工厂法使用比较简单,也比较灵活,但依赖于服务契约,不适合生产,更适合开发调试。

本文中,讲述了WCF客户端代理对象创建技术的一些基本常识和使用技巧。下篇文章将做一步深入:如何生成元数据需要证书验证的客户端代理

最后,项目实例代码: http://files.cnblogs.com/jillzhang/CreateClientInstanceWays.rar
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: