WCF开发框架中有一种叫做WCF信道工厂的东西。对于刚刚接触WCF不久的朋友可能对其还不太了解。由于信道管理器在客户端和服务端所起的不同作用,分为信道监听器和信道工厂。#t#
湖州ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为创新互联建站的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:18980820575(备注:SSL证书合作)期待与您的合作!
和服务端的信道监听其相比,处于客户端的信道工厂显得简单。从名称就可以看得出来,WCF信道工厂的作用就是单纯的创建用于消息发送的信道。我们先来看看与信道工厂相关的一些接口和基类的定义。
一、WCF信道工厂相关的接口和基类
对于信道监听器,WCF定义了两个接口:IChannelListener和IChnnelListener< TChannel>。与之相对地,WCF也为信道工厂定义了两个接口:IChannelFactory和IChannelFactory< TChannel>。这两个接口定义了信道工厂最基本的功能和属性,下面是这两个接口的定义:
由于WCF信道工厂的目的就是单纯的创建信道,所以IChannelFactory和IChannelFactory< TChannel>的定义显得格外简洁。两个重载的CreateChannel方法通过目的终结点的地址(to),以及在手工寻址下不同于目的终结点地址的另一个地址,该地址是消息实际会被发送的地址(via)。关于To和Via可以参考第二章关于物理地址和逻辑地址的部分。
除了上面的两个接口之外,WCF还定义分别是实现了它们的两个抽象基类:ChannelFactoryBase和ChannelFactoryBase< TChannel>。
ChannelFactoryBase继承自所有信道管理器的基类:CnannelManagerBase,而ChannelManagerBase又继承自CommunicationObject,实现ICommunicationObject接口定义的基本的状态属性和状态转换功能。并且实现了接口IChannelFactory和ICommunicationObject。而ChannelFactoryBase< TChannel>继承自CnannelManagerBase,并且实现了接口:IChannelFactory< TChannel>, IChannelFactory和ICommunicationObject。
一般地,范型类型TChannel为基于相应channel shape下客户端信道类型,比如IOutputChannel、IRequestChannel和IDuplexChannel。ChannelFactoryBase和ChannelFactoryBase< TChannel>的简单定义如下:
- public abstract class ChannelFactoryBase
: ChannelManagerBase, IChannelFactory,
ICommunicationObject- {
- ......
- }
- public abstract class ChannelFactoryBase
< TChannel> : ChannelFactoryBase, IChannel
Factory< TChannel>, IChannelFactory,
ICommunicationObject- {
- ......
- }
二、案例演示:如何自定义WCF信道工厂
在上一个案例中,我们创建了一个自定义的信道监听器:SimpleReplyChannelListner。该信道监听器用于在请求-回复消息交换模式下进行请求的监听。在本案例中,我们来创建与之相对的信道工厂:SimpleChannelFactory< TChannel>,用于请求-回复消息交换模式下进行用于请求发送信道的创建。由于SimpleChannelFactory< TChannel>的实现相对简单,将所有代码一并附上。
SimpleChannelFactory< TChannel>直接继承自抽象基类SimpleChannelFactoryBase< TChannel>。字段成员_innerChannelFactory表示信道工厂栈中后一个信道工厂对象,该成员在构造函数中通过传入的BindingContext对象的BuildInnerChannelFactory< TChannel>方法创建。
OnCreateChannel是核心大方法,实现了真正的信道创建过程,在这里我们创建了我们自定义的信道:SimpleRequestChannel.。构建SimpleRequestChannel. 的InnerChannel通过_innerChannelFactory的CreateChannel方法创建。对于其他的方法(OnOpen、OnBeginOpen和OnEndOpen),我们仅仅通过PrintHelper输出当前的方法名称,并调用_innerChannelFactory相应的方法。
- public class SimpleChannelFactory< TChannel>
: ChannelFactoryBase< TChannel>- {
- public IChannelFactory< TChannel> _innerChannelFactory;
- public SimpleChannelFactory(BindingContext context)
- {
- PrintHelper.Print(this, "SimpleChannelFactory");
- this._innerChannelFactory = context.
BuildInnerChannelFactory< TChannel>();- }
- protected override TChannel OnCreateChannel
(EndpointAddress address, Uri via)- {
- PrintHelper.Print(this, "OnCreateChannel");
- IRequestChannel innerChannel = this._
innerChannelFactory.CreateChannel(address,
via) as IRequestChannel;- SimpleRequestChannel. channel = new
SimpleRequestChannel.(this, innerChannel);- return (TChannel)(object)channel;
- }
- protected override IAsyncResult OnBeginOpen
(TimeSpan timeout, AsyncCallback callback,
object state)- {
- PrintHelper.Print(this, "OnBeginOpen");
- return this._innerChannelFactory.BeginOpen
(timeout, callback, state);- }
- protected override void OnEndOpen(IAsyncResult result)
- {
- PrintHelper.Print(this, "OnEndOpen");
- this._innerChannelFactory.EndOpen(result);
- }
- protected override void OnOpen(TimeSpan timeout)
- {
- PrintHelper.Print(this, "OnOpen");
- this._innerChannelFactory.Open(timeout);
- }
- }
名称栏目:WCF信道工厂接口与相关基类描述
URL分享:http://www.mswzjz.cn/qtweb/news1/266201.html
攀枝花网站建设、攀枝花网站运维推广公司-贝锐智能,是专注品牌与效果的网络营销公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 贝锐智能