本主题讨论可靠会话的最佳做法。
设置最大传输窗口大小
Windows Communication Foundation (WCF) 中的可靠会话使用传输窗口在客户端和服务上保存消息。 可配置属性 MaxTransferWindowSize 指示传输窗口可以保存的消息数。
在发送方上,这表示传输窗口在等待确认时可以保留的消息数;在接收方上,它指示要为服务缓冲的消息数。
选择正确的大小会影响网络的效率和服务的最佳容量。 以下部分详细介绍了为此属性选择值以及值的影响时要考虑的事项。
默认传输窗口大小为 8 条消息。
高效使用网络
在此上下文中,术语 网络 对应于用作客户端(发送方)和服务(接收方)之间的通信基础的所有内容。 这包括传输连接以及中间的任何中介或网桥,包括 SOAP 路由器或 HTTP 代理/防火墙。
高效使用网络可确保完全使用网络容量。 可以通过网络(数据速率)每秒传输的数据量以及将数据从发送方传输到接收方所需的时间(延迟)都会影响网络利用率。
在发送方上,该属性 MaxTransferWindowSize 指示其传输窗口在等待确认时可以保留的消息数。 如果网络延迟较高,并且为了确保响应式发送方和有效的网络利用率,应增加传输窗口大小。
例如,即使发送方跟上数据速率,如果发送方和接收方之间存在多个中介,或者数据必须通过丢失的中介或网络,延迟也可能很高。 因此,发送方必须等待消息在传输窗口中的确认,然后才能接受要在网络上发送的新邮件。 延迟较高的缓冲区越小,网络利用率越低。 另一方面,传输窗口大小过高可能会影响服务,因为服务可能需要赶上客户端发送的高数据速率。
将服务运行到满负荷
与有效使用网络一样,理想情况下,还希望服务以最佳容量运行。 接收方上的传输窗口大小属性指示接收方可以缓冲的消息数。 此消息缓冲不仅有助于网络流控制,还使服务能够运行到完整容量。 例如,如果缓冲区是一条消息,消息到达的速度比服务更快地处理它们,则网络可能会丢弃消息,容量可能会浪费或未充分利用。
使用缓冲区会增加服务的可用性,因为它同时接收消息,并在处理以前接收的消息时缓冲消息。
建议在发送方和接收方上使用相同 MaxTransferWindowSize
。
启用流控制
流控制 是一种机制,可确保发送方和接收方彼此保持同步,即消息的使用和处理速度与生成消息的速度一样快。 客户端和服务上的传输窗口大小可确保发送方和接收方位于合理的同步时段内。
强烈建议在 WCF 客户端和 WCF 服务之间使用可靠会话时,将属性 FlowControlEnabled 设置为 true
。
设置 MaxPendingChannels
编写能够从不同客户端进行可靠会话通信的服务时,可以让许多客户端同时与服务建立可靠的会话。 在这些情况下,服务的响应取决于属性 MaxPendingChannels
。
当发送方创建到接收方的可靠会话通道时,发送方和接收方之间的握手将建立可靠会话。 建立可靠会话之后,该通道会放入到挂起的通道队列中以供服务接受。 该 MaxPendingChannels
属性指示可以处于此状态的通道数。
服务可能处于无法接受更多通道的状态。 如果队列已满,则会拒绝建立可靠会话的尝试,并且客户端必须重试。
队列中挂起的通道也可能会在队列中保持很长时间。 同时,可能会出现可靠会话的非活动超时,从而导致通道转换到错误状态。
编写同时为多个客户端提供服务的服务时,应设置一个适合你的需求的值。 为 MaxPendingChannels
属性设置的值过高会影响工作集。
默认值 MaxPendingChannels 为四个通道。
可靠会话和托管
当部署使用可靠会话的 Web 服务时,需要牢记以下重要注意事项:
可靠会话是有状态的,而状态在 AppDomain 中进行维护。 这意味着必须在同一 AppDomain 中处理属于可靠会话的所有消息。 大小超过 1 个节点的 Web 场和 Web 园无法保证满足此约束。
使用双 HTTP 通道(例如,using
WsDualHttpBinding
)的可靠会话可能需要超过每个客户端两个 HTTP 连接的默认值。 这意味着双向可靠会话可能需要每个方向最多两个连接,因为并发的应用程序和协议消息可能会在任意给定时刻双向传输。 在某些情况下,根据服务的消息交换模式,这意味着可以使用双重 HTTP 和可靠会话来死锁 Web 托管服务。 若要增加每个客户端允许的 HTTP 连接数,请将以下内容添加到相关的配置文件(例如, web.config 相关的服务):<configuration> <system.net> <connectionManagement> <add name="*" maxconnection="4" /> </connectionManagement> </system.net> </configuration>
属性的值
maxconnection
是所需的连接数。 在这种情况下,最小值应为四个连接。