可靠会话概述
Windows Communication Foundation (WCF) SOAP 可靠消息传递在 SOAP 终结点之间提供端到端消息传输可靠性。 此消息传递通过克服传输失败和 SOAP 消息级别失败,可在不可靠的网络上实现传输可靠性。 具体而言,它为跨 SOAP 或传输中介发送的消息提供了一种基于会话的、单一的和(可选)有序的传送。 基于会话的传送在会话中提供按消息分组,并选择性地将消息排序。
本主题介绍可靠会话、其使用方式和时机,以及如何保护它们。
WCF 可靠会话
WCF 可靠会话是 WS-ReliableMessaging 协议定义的 SOAP 可靠消息传递的一个实现。
WCF SOAP 可靠消息传递提供两个终结点之间的端到端的可靠会话,而不管消息传递的终结点之间相隔的中介的数量或类型如何。 这包括不使用 SOAP 的任何传输中介(例如 HTTP 代理)或在终结点之间流动所必需的使用 SOAP 的中介(例如基于 SOAP 的路由器或网桥)。 可靠会话通道支持交互式通信,因此通过这类通道连接的服务可以并发运行,并可以在低延迟的条件下(即,在相对较短的时间间隔内)交换和处理消息。 这种耦合意味着这些组件将同时成功或同时失败,因此它们之间没有提供隔离。
可靠会话可以屏蔽两种失败情况:
SOAP 消息级失败,其中包括消息丢失或重复的情况以及消息到达的顺序与消息发送的顺序不同的情况。
传输失败。
可靠会话实现 WS-ReliableMessaging 协议和内存中传输窗口以屏蔽 SOAP 消息级失败,并在传输失败的情况下重新建立连接。
可靠会话为 SOAP 消息提供 TCP 为 IP 数据包提供的内容。 TCP 套接字连接在节点之间提供单个的 IP 数据包有序传输。 可靠通道提供相同类型的可靠传输,但在以下方面与 TCP 套接字可靠性不同:
可靠性位于 SOAP 消息级别,而不是针对一个任意大小的字节数据包。
可靠性与传输无关,而不仅仅是针对基于 TCP 的传输。
可靠性不与特定的传输会话(例如,TCP 连接提供的会话)相关联,并可以在可靠会话的生存期中以并发或顺序方式使用多个传输会话。
可靠会话是发送方和接收方的 SOAP 终结点之间的会话,与二者之间的连接所需的传输连接的数目无关。 简而言之,TCP 可靠性在传输连接结束的位置结束,而可靠会话提供端到端的可靠性。
可靠会话和绑定
如前所述,可靠会话与传输无关。 此外,可以通过许多消息交换模式(例如请求-答复或双工模式)建立可靠会话。 因此,WCF 可靠会话将作为一组绑定的属性公开。
在使用以下绑定的终结点上使用可靠会话:
基于 HTTP 的传输协议标准绑定:
WsHttpBinding
并公开请求-答复或单向协定。对请求-答复或简单的单向服务协定使用可靠会话时。
WsDualHttpBinding
并公开双工、请求-答复或单向协定。WsFederationHttpBinding
并公开请求-答复或单向协定。
基于 TCP 的传输协议标准绑定:
NetTcpBinding
并公开双工、请求答复或单向协定。
通过创建自定义绑定(例如 HTTPS,有关问题的详细信息,请参阅可靠会话和安全性)或命名管道绑定,可以在任何其他绑定上使用可靠会话。
可以在不同的基础通道类型上堆叠可靠会话,生成的可靠会话通道形状将会不同。 在客户端和服务器上,支持的可靠会话通道的类型取决于使用的基础通道的类型。 下表列出了在客户端上作为基础通道的一项功能支持的会话通道的类型。
支持的可靠会话通道类型† | IRequestChannel |
IRequestSessionChannel |
IDuplexChannel |
IDuplexSessionChannel |
---|---|---|---|---|
IOutputSessionChannel |
是 | 是 | 是 | 是 |
IRequestSessionChannel |
是 | 是 | 否 | No |
IDuplexSessionChannel |
No | No | 是 | 是 |
†支持的通道类型是可用于传入到 BuildChannelFactory<TChannel>(BindingContext) 方法的泛型 TChannel
参数值的值。
下表列出了在服务器上作为基础通道的一项功能支持的会话通道的类型。
支持的可靠会话通道类型‡ | IReplyChannel |
IReplySessionChannel |
IDuplexChannel |
IDuplexSessionChannel |
---|---|---|---|---|
IInputSessionChannel |
是 | 是 | 是 | 是 |
IReplySessionChannel |
是 | 是 | 否 | No |
IDuplexSessionChannel |
No | No | 是 | 是 |
‡支持的通道类型是可用于传入到 BuildChannelListener<TChannel>(BindingContext) 方法的泛型 TChannel
参数值的值。
可靠会话和安全性
保护可靠会话的安全很重要,这可以确保对通信方(服务和客户端)进行身份验证以及在会话中交换的消息不会被篡改。 此外,必须确保每个单独的可靠会话的完整性。 通过将可靠会话绑定到由安全会话通道表示和管理的安全上下文,可以保护可靠会话。 安全通道提供安全会话。 然后,使用在会话建立的过程中交换的安全令牌保护可靠会话中的消息。
通过 TCP 建立可靠会话时,TCP 会话将关联到可靠会话。 因此,传输安全性机制可确保安全性也关联到可靠会话。 在此情况下,将关闭重新建立连接的操作。
唯一的例外是在使用 HTTPS 时。 安全套接字层 (SSL) 会话未绑定到可靠会话。 这会造成某种安全威胁,这是因为共享安全上下文(SSL 会话)的会话彼此之间不设防,根据不同的应用程序,这可能是也可能不是一种真正的安全威胁。
使用可靠会话
若要使用 WCF 可靠会话,请使用支持可靠会话的绑定创建一个终结点。 使用 WCF 提供的一种启用可靠会话的、系统提供的绑定,或创建自己的可实现此功能的自定义绑定。
默认情况下支持并启用可靠会话的系统定义的绑定包括:
支持可靠会话(作为选项)但默认情况下不启用可靠会话的系统提供的绑定包括:
有关如何创建自定义绑定的示例,请参阅如何:使用 HTTPS 创建自定义可靠会话绑定。
有关支持可靠会话的 WCF 绑定的介绍,请参阅系统提供的绑定。
何时使用可靠会话
了解何时在应用程序中使用可靠会话非常重要。 WCF 支持在同时处于活动和生存状态的终结点之间建立可靠会话。 如果应用程序要求一个终结点在某个持续时间内不可用,请使用列队实现可靠性。
如果方案需要通过 TCP 连接的两个终结点,则 TCP 可能足以提供可靠的消息交换。 不过没有必要使用可靠会话,因为 TCP 可确保数据包按顺序抵达,并且只抵达一次。
如果方案具有以下任何特征,则必须认真考虑是否使用可靠会话。
SOAP 中介,例如 SOAP 路由器
代理中介或传输网桥
连接时好时坏
基于 HTTP 的会话