WCF技术内幕之通道

    通道用于发送和接收消息。通道负责传输工作和WS-*协议的实现、安全及事务处理。通道是高组合性的,换句话说,它可以通过多种方式组合以实现应用程序需要的功能。通道是可扩展的,并且WCF API的设计也允许开发自定义通道。

正确认识通道

    在应用程序里,通道一般都是与消息通信密切相关的。如果一个WCF应用程序是安全的、可靠的和支持事务处理的,那么该应用程序一定是一个通道提供安全性,另一个通道提供可靠性,再一个通道提供事务支持能力。因为每个通道都有自己特定的功能,而大部分程序所需要的功能超过了一个通道的能力范围,所以WCF应用程序可组合的通道放在一个堆栈里,然后使用堆栈中提供的功能。

    WCF程序只会使用堆栈顶端的通道。入栈以后,通道会执行特定的工作,然后调用推栈中的下一个通道(或者调用下一个通道,在调用返回之前继续做自己的工作)。这里重要的一点是,一旦消息被发送到堆栈的通道里,通道堆栈会在其内部推进,或者拉回消息。没有任何外部控制器来管理内部通道之间的消息传递。当一个程序建立了一个通道堆栈,这个堆栈就是一个外部不透明的实体。绝大部分情况下,通道堆栈会在顶部通道接收或返回一个消息,而堆栈底部通道会从传输层发送或接收字节流。换句话说,在接收程序的通道堆栈里,底部通道会接收字节流,然后顶部通道会返回一个Message对象。中间发生了什么取决于内部驻留的通道。通道堆栈中间的通道通常都是关于WS-*协议或安全规范的物理实现。图6-1所示为一个消息发送程序的通道堆栈结构。

通道状态机

    通道和通道工厂拥有相同的特性,这些特性独立于运行时的功能。其中最重要的特性之一就是它们拥有公共的状态机。WCF程序中的每个通道和通道工厂都有一个预定义的状态集合和预定义的方法集合,这些方法会控制通道和通道工厂之间状态的转换。

    在面向对象层次上,WCF类型系统强制实现了各个通道共用一个状态机,方式就是所有的通道和通道工厂都实现System.ServiceModel.ICommunicationObject接口。这个接口如下:

    CommunicationObject是所有通道的基类,且CommunicationObject类型实现了ICommunicationObject接口。Open、Close和Abort方法可确保通道状态按照一种连续的方式转换。如图6-2所示,CommunicationObject不仅实现了ICommunicationObject接口,会在适当的时机激活事件、调用抽象和虚方法,同时还提供了实现错误处理一致性的帮助方法。

通道形状介绍

    通道形状是对通道进行分类的重要依据之一。从概念上说,一个通道形状对应应用于一个或多个消息交换模式。WCF类型系统定义了几个描述不同通道形状的接口,这些接口与之前介绍的消息交换模式一一对应。表6-2列举了消息交换模式、发送者和接收者之间的对应关系。

表6-1 消息交换模式与通道形状的关系
MEPSenderReceiver
数据报IOutputChannelIInputChannel
请求/应答IRequestChannelIReplyChannel
双工IDuplexChannelIDuplexChannel
P2PIDuplexChannelIDuplexChannel

    对于数据报消息交换模式,发送者发送一个消息,但是不能接收消息,而请求/应答模式是可以的。记住,IOutputChannel定义了一个名为Send的方法,而IInputChannel定义了一个名为Receive的方法。在双工消息交换模式中,发送者和接收者都可以发送和接收消息。在成员级别上,两者都可以定义名为Send和名为Receive的方法。在双工消息交换模式中,发送者和接收者都可以发送和接收消息。在成员级别上,两者都可以定义名为Send和名为Receive的方法。

通道接口和基本类型

    IChannel接口

        IChannel对于通道层的实现至关重要。所有的通道和通道工厂必须实现它。换句话说,一个集成了CommunicationObject的类型通常也会实现IChannel接口。

public interface IChannel : ICommunicationObject
{
    T GetProperty<T>() where T : class;
}

        在堆栈组合正常的情况下,GetProperty<T>方法提供了在CommunicationObject堆栈里查询特定功能的途径。

    数据报通道:InputChannel与IOutputChannel

        数据报消息交换模式非常强大且具有很强的伸缩性。在数据报消息交换模式中,发送者发送一个消息到接收者而不期望得到回复。

    请求/应答通道:IRequestChannel和IReplyChannel

        在请求/应答消息交换模式里,消息的参与者都要发送和接收消息。发送者发送消息给接收者,然后等待回复;接收者会接收请求消息,然后发送一个回复消息。为了实现通道形状,IRequestChannel和IReplyChannel接口分别定义了符合请求/应答消息交换模式的成员。

    双工通道:IDuplexChannel

        双工通道支持双工消息交换模式。与数据报和请求/应答消息交换模式不同的是,双工消息交换模式允许发送者和接收者自由发送和接收消息。

    ChannelBase类型

        所有的自定义通道必须实现公共的状态机,并且暴露GetProperty<T>查询机制,实现一个或多个通道形状,从通道工厂中接收一个超时设置。System.ServiceModel.Channels.ChannelBase抽象类型就是这个目的,它确保了所有通道成员的兼容性。

通道功能

    传输通道

        传输通道是与网络、文件系统、内存或其他抽象交互的通道。WCF至少有一个对应的通道lai来支持每一个传输,例如,WCF支持TCP/IP通信,且WCF程序与Socket交互的工具就是TCP/IP通道。

    协议通道

        协议通道是WCF实现消息协议的主要方式,如WS-ReliableMessaging、WS-AtomicTransaction和WS-SecureConversation。实际上,WCF是通过协议通道来支持WS-*规范的。因为WS-*规范中规定程序级别的消息交换可以在传输层产生多个消息。在通道堆栈中,WS-*协议通道通常产生消息,上层的通道不会理解这些消息,如图6-1所示的通道堆栈。


图6-1支持WS-ReliableMessaging协议的通道

    组合通道

        组合通道允许通道在堆栈里修改通道形状。这样,组合通道就创建了一种使用已有功能模块的新方式。

    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值