Windows Communication Foundation (WCF) 通道堆栈是一个分层通信堆栈,其中包含处理消息的一个或多个通道。 堆栈底部是一个传输通道,负责将通道堆栈适应基础传输(例如 TCP、HTTP、SMTP 和其他类型的传输)。 通道提供用于发送和接收消息的低级别编程模型。 此编程模型依赖于多个接口和其他类型,这些类型总称为 WCF 通道模型。 本主题讨论通道形状、基本通道侦听器(在服务上)和通道工厂(在客户端上)的构造。
通道堆栈
WCF 终结点使用称为通道堆栈的通信堆栈与世界通信。 下图将通道堆栈与其他通信堆栈(例如 TCP/IP)进行比较。
首先说明共同点:在两种情况下,堆栈的每一层均提供该层下面一层的一些抽象,并仅向其上的一层公开该抽象。 每一层都仅使用紧邻其下的层的抽象。 同样,在这两种情况下,当两个堆栈通信时,每个层与其他堆栈中的相应层通信,例如,IP 层与 IP 层通信,TCP 层与 TCP 层等通信。
现在,区别在于:虽然 TCP 堆栈旨在提供物理网络的抽象,但通道堆栈旨在提供传递消息的方式(即传输)以及其他功能,例如消息中的内容或用于通信的协议, 包括运输,但远不止于此。 例如,可靠会话绑定元素是通道堆栈的一部分,但不低于传输或传输本身。 通过要求堆栈中的底部通道将基础传输协议适应通道堆栈体系结构,然后依赖于堆栈中进一步的通道来提供可靠性保证和安全等通信功能来实现此抽象。
消息作为 Message 对象流经通信堆栈。 如上图所示,底部通道称为传输通道。 它是负责向其他各方发送和接收消息的通道。 这包括负责在与用于和其他方通信的格式之间转换 Message 对象。 传输通道上方可以有任意数量的协议通道,每个通道负责提供通信功能,例如可靠的传递保证。 协议通道处理流经其中的消息,这些消息以Message对象的形式存在。 它们通常通过添加标头或加密正文来转换消息,或者发送和接收自己的协议控制消息,例如接收确认。
通道形状
每个通道均实现一个或多个接口,称为通道形状接口或通道形状。 这些通道形状提供面向通信的方法(如通道实现的发送和接收或请求和答复)和通道调用的用户。 在通道形状的底部是 IChannel 接口,该接口提供一种 GetProperty
<T> 方法,旨在用作分层机制,以访问堆栈中的通道公开的任意特征。 扩展 IChannel 的五个通道形状包括:
另外,这些形状中的每个形状均有一个扩展 System.ServiceModel.Channels.ISessionChannel<TSession> 以支持会话的等效项。 其中包括:
通道形状仿照现有传输协议支持的一些基本消息交换模型。 例如,单向消息传送对应于IInputChannel/IOutputChannel对,请求-答复对应于IRequestChannel/IReplyChannel对,双向双工通信对应于IDuplexChannel(其扩展了IInputChannel和IOutputChannel)。
使用通道堆栈编程
通道堆栈通常是使用工厂模式创建的,在这种模式中,绑定创建通道堆栈。 在发送端,使用绑定生成 ChannelFactory,而后者生成通道堆栈并返回对堆栈中顶部通道的引用。 然后,应用程序可以使用此通道发送消息。 有关详细信息,请参阅 客户端 Channel-Level 编程。
在接收端,使用绑定生成 IChannelListener,用于侦听传入消息。 该 IChannelListener 命令通过创建通道堆栈并将应用程序引用交给顶部通道,从而向侦听应用程序提供消息。 然后,应用程序使用此通道接收传入消息。 有关详细信息,请参阅 服务 Channel-Level 编程。
通道对象模型
通道对象模型是实现通道、通道侦听器和通道工厂所需的核心接口集。 还提供了一些基类来帮助实现自定义实现。
通道侦听器负责侦听传入消息,然后通过通道侦听器创建的通道将其传递到上面的层。
通道工厂负责创建用于发送消息的通道,并在通道工厂关闭时关闭其创建的所有通道。
ICommunicationObject 是定义所有通信对象实现的基本状态机的核心接口。 CommunicationObject 提供此核心接口的实现,其他通道类可以从中派生,而不是重新实现接口。 但是,这不是必需的:自定义通道可以直接实现 ICommunicationObject,并且不继承自 CommunicationObject。 图 3 中的类都不被视为通道模型的一部分;它们是可供想要生成通道的自定义通道实现者的帮助程序。
以下主题介绍通道对象模型以及帮助生成自定义通道的各种开发区域。
主题 | DESCRIPTION |
---|---|
服务:通道侦听器和通道 | 描述在服务应用程序中侦听传入通道的通道侦听器。 |
客户端:通道工厂和通道 | 描述通道工厂,这些工厂创建用于连接到服务应用程序的通道。 |
了解状态更改 | System.ServiceModel.ICommunicationObject 接口描述了如何在通道中建模状态变化。 |
选择消息交换模式 | 介绍通道可以支持的六种基本消息交换模式。 |
处理异常和错误 | 介绍如何在自定义通道中处理错误和异常。 |
配置和元数据支持 | 介绍如何支持使用应用程序模型中的自定义通道,以及如何使用绑定和绑定元素导出和导入元数据。 |