前面我们扩展了ServiceHost,这节我们将扩展ChannelFactory
由于 DuplexChannelFactory<T>继承了 ChannelFactory<T>
本节我们以扩展DuplexChannelFactory<T>为例进行说明。
当然,别担心,这两个类的扩展我们都会提供源代码。
一个LDuplex<T> + LChannelFactory<T>
5.1 客户端配置文件 App.config
在一定程度上,WCF是依赖于配置的编程,即便我们可以以编码的方式添加WCF运行参数。
如图5.1.1所示。
5.2 完整的客户端配置文件 App.config
客户端配置由三部分关键信息组成:
Client : 含endpoint节点的客户端通信信息
Bindings: 绑定参数。主要是TCP通信控制参数,为client中的endpoint信息服务。
Behaviors: 行为。为client中的endpoint信息服务。
还记不记得我们的服务端的配置
服务 – 绑定 – 行为
有了这样的对比,只是这儿从服务变成了客户。我们基本清楚了ChannelFactory要做一些什么工作。
你可能猜测,这个ChannelFactory类是不是也得有一个
方法来对配置进行操作,而我们只需要重写ApplyConfiguration就可以了?
你猜得没错。的确。ChannelFactory类有这样的方法存在:
不过,我们在 ChannelFactory 中的确要重写基类的这个方法,但还要重写另外一个方法:
这是因为,可能有很多endpoint,我们需要将每一个endpoint信息加入到 ServiceEndpoint中
你的想法是对了。这儿一个用来单向通信,DuplexChannelFactory则是双向通信的。
扩展2个类
public class LChannelFactory<T> : ChannelFactory<T>
public class LDuplex<T> : DuplexChannelFactory<T>
由于 DuplexChannelFactory<T>继承了 ChannelFactory<T>
本节我们以扩展DuplexChannelFactory<T>为例进行说明。
当然,别担心,这两个类的扩展我们都会提供源代码。
一个LDuplex<T> + LChannelFactory<T>
5.1 客户端配置文件 App.config
1)要真正讲扩展ChannelFactory之前,我还还是来了解下,我们ChannelFactory扩展操作了哪些参数。所以,与ServiceHost一样,先了解配置。
2)这儿也是一个App.config在一定程度上,WCF是依赖于配置的编程,即便我们可以以编码的方式添加WCF运行参数。
如图5.1.1所示。
客户端配置非常简单,甚至连行为配置behaviorConfiguration也可为空。但此处我们为了完整的说明客户商端配置。我们采用图 5.1.2去解释客户端完整的配置。
图5.1.1客户端配置
5.2 完整的客户端配置文件 App.config
客户端配置由三部分关键信息组成:
Client : 含endpoint节点的客户端通信信息
Bindings: 绑定参数。主要是TCP通信控制参数,为client中的endpoint信息服务。
Behaviors: 行为。为client中的endpoint信息服务。
还记不记得我们的服务端的配置
服务 – 绑定 – 行为
客户 – 绑定 – 行为
有了这样的对比,只是这儿从服务变成了客户。我们基本清楚了ChannelFactory要做一些什么工作。
你可能猜测,这个ChannelFactory类是不是也得有一个
protected virtual void ApplyConfiguration();
方法来对配置进行操作,而我们只需要重写ApplyConfiguration就可以了?
你猜得没错。的确。ChannelFactory类有这样的方法存在:
protected virtual void ApplyConfiguration(string configurationName);
不过,我们在 ChannelFactory 中的确要重写基类的这个方法,但还要重写另外一个方法:
protected override ServiceEndpoint CreateDescription();
这是因为,可能有很多endpoint,我们需要将每一个endpoint信息加入到 ServiceEndpoint中
图5.2.1客户端完整配置
现在。我们的问题清楚了。我们要重写CreateDescription方法,并加入client信息,bindings信息与behaviors信息。这样我们将达成最初的设想。
回过头来,看前面提到的
public class LChannelFactory<T> : ChannelFactory<T>
public class LDuplex<T> : DuplexChannelFactory<T>
public class LChannelFactory<T> : ChannelFactory<T>
public class LDuplex<T> : DuplexChannelFactory<T>
你的想法是对了。这儿一个用来单向通信,DuplexChannelFactory则是双向通信的。