Windows Communication Foundation (WCF) SOAP 可靠消息传送在 SOAP 终结点之间提供端到端消息传输可靠性。 它通过克服传输故障和 SOAP 消息级故障,在不可靠的网络上执行此操作。 具体而言,它为跨 SOAP 或传输中介发送的消息提供了一种基于会话的、单一的和(可选)有序的传送。 基于会话的发送使消息在一个会话中进行分组,并允许对消息进行可选排序。
本主题介绍可靠会话、如何使用它们、什么时候使用它们,以及如何保护它们。
WCF 可靠会话
WCF 可靠会话是 SOAP 可靠消息传送的实现,由 WS-ReliableMessaging 协议定义。
WCF SOAP 可靠消息传送提供两个终结点之间的端到端可靠会话,而不考虑分隔消息终结点的中介的数量或类型。 这包括不使用 SOAP(例如 HTTP 代理)或使用 SOAP(例如基于 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 |
是的 | 是的 | 否 | 否 |
IDuplexSessionChannel |
否 | 否 | 是的 | 是的 |
†支持的通道类型是可用于传入到 BuildChannelFactory<TChannel>(BindingContext) 方法的泛型 TChannel
参数值的值。
下表列出了服务器上支持的会话通道类型,作为基础通道类型的函数。
支持的可靠会话通道类型* | IReplyChannel |
IReplySessionChannel |
IDuplexChannel |
IDuplexSessionChannel |
---|---|---|---|---|
IInputSessionChannel |
是的 | 是的 | 是的 | 是的 |
IReplySessionChannel |
是的 | 是的 | 否 | 否 |
IDuplexSessionChannel |
否 | 否 | 是的 | 是的 |
‡支持的通道类型是可用于传入到 BuildChannelListener<TChannel>(BindingContext) 方法的泛型 TChannel
参数值的值。
可靠会话和安全性
保护可靠会话非常重要,以确保通信方(服务和客户端)经过身份验证,并且会话中交换的消息不会被篡改。 此外,确保每个可靠会话的完整性至关重要。 通过将可靠会话绑定到由安全会话通道表示和管理的安全上下文来实现保护。 安全通道提供安全会话。 然后,使用在会话建立的过程中交换的安全令牌保护可靠会话中的消息。
当可靠会话在 TCP-S 协议上运行时,TCP 会话会与可靠会话绑定。 因此,传输安全性机制可确保安全性也关联到可靠会话。 在这种情况下,连接重新建立功能被关闭。
唯一的例外是使用 HTTPS。 安全套接字层 (SSL) 会话未绑定到可靠会话。 这会造成威胁,因为共享安全上下文(SSL 会话)的会话不会相互保护;这可能不是真正的威胁,具体取决于应用程序。
使用可靠会话
若要使用 WCF 可靠会话,请使用支持可靠会话的绑定创建终结点。 使用 WCF 提供的一种启用可靠会话的、系统提供的绑定,或创建自己的可实现此功能的自定义绑定。
默认情况下支持和启用可靠会话的系统定义的绑定包括:
系统提供的绑定支持可靠会话作为选项,但默认情况下不会启用这些绑定,包括:
有关如何创建自定义绑定的示例,请参阅 如何:使用 HTTPS 创建自定义可靠会话绑定。
有关支持可靠会话的 WCF 绑定的讨论,请参阅 System-Provided 绑定。
何时使用可靠会话
请务必了解何时在应用程序中使用可靠会话。 WCF 支持同时处于活动状态且正在运行的终结点之间的可靠会话。 如果应用程序要求其中一个终结点在一段时间内不可用,请使用队列来实现可靠性。
如果方案需要通过 TCP 连接两个终结点,则 TCP 可能足以提供可靠的消息交换。 尽管不需要使用可靠会话,因为 TCP 可确保数据包按顺序到达,并且只到达一次。
如果方案具有以下任何特征,则必须认真考虑是否使用可靠会话。
SOAP 中介,如 SOAP 路由器
代理中介或传输网桥
间歇性连接
通过 HTTP 进行会话