重温WCF之WCF中可靠性会话(十四)
1.WCF中可靠性会话在绑定层保证消息只会被传输一次,并且保证消息之间的顺序。当使用TCP(Transmission Control Protocol,传输控制协议)通信时,协议本身保证了可靠性。
然而,它只在两点之间的网络包这个层面提供了这样的保证。WCF的可靠性会话特性保证了在传输过程中消息不会丢失、重复或错位。这种保证是消息层面的,而且适用于任何数目
节点的通信。另外,使用可靠性会话时,WCF会重连掉线的连接,在重连失败时还会释放会话占用的相关资源。可靠性会话还会通过调整消息的发送频率来缓解网络拥挤。
可靠性会话主要解决以下几个问题:
确保消息可靠交付(消息不会丢失、重复或错位)
确保消息单一性(消息只会被传送一次)
确保消息有序性(确定消息之间的传输顺序)
系统有多个绑定支持可靠性会话功能:wsHttpBinding、wsDualHttpBinding、wsFederationBinding、netTcpBinding、netNamedPipesBinding。
其中wsHttpBinding、wsFederationBinding、netTcpBinding在默认情况下可靠性会话功能是关闭。而wsDualHttpBinding、netNamedPipesBinding则默认支持可靠性功能。
2.reliableSession 属性
1.enable
返回值为bool类型,代表是否打开可靠性功能。
2.inactivityTimeout
返回值为TimeSpan类型,代表闲置超时时间,默认值为10分钟,如果客户端已经建立起服务对象,在超过此时间内没有重新调用这些对象,系统将发送提示信息: “通信对象 System.ServiceModel.Channels.ServiceChannel 无法用于通信,因为其处于‘出错’状态。”。
3.ordered
返回值为bool类型,代表是否开启“有序性”性功能,如果开启此功能,代表消息将按顺序传送。
4.maxPendingChannels
返回值为int 类型,代表最大等候信道,默认值为4。
5.maxRetryCount
返回值为int 类型,表示最大重复发送次数,默认值为8,最大值为20。如果因断线等原因连接失败,客户端重试次数超过此最大值,系统将发出错误提示。
6.flowControlEnabled
返回值为bool类型,默认值为true,代表是否启动流量控制器。启动后,当接收方的传输数据缓冲区已满时,发送方将延迟发送信息。
7.acknowledgementInterval
返回值为TimeSpan类型,默认值为00:00:00.2(即0.2秒),代表接收方在接收信息之前所需要的等待时间。
8.maxTransferWindowSize
返回值为int类型,默认值为8,用于控制数据缓冲区数量。
<configuration> <system.serviceModel> <behaviors> <serviceBehaviors> <behavior name=""> <serviceMetadata httpGetEnabled="false" /> <serviceDebug includeExceptionDetailInFaults="true" /> </behavior> </serviceBehaviors> </behaviors> <bindings> <netTcpBinding> <binding name="defaultNetTcpBinding"> <!--打开可靠性会话功能,把过期时间配置为10秒--> <reliableSession enabled="true" inactivityTimeout="00:00:10"/> </binding> </netTcpBinding> </bindings> <services> <service name="Pro.Service.PersonService"> <!--绑定defaultNetTcpBinding--> <endpoint address="" bindingConfiguration="defaultNetTcpBinding" binding="netTcpBinding" contract="Pro.Service.IPersonService"> <identity> <dns value="localhost" /> </identity> </endpoint> <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" /> <host> <baseAddresses> <add baseAddress="net.Tcp://localhost:6000/Pro.Service/PersonService/" /> </baseAddresses> </host> </service> </services> </system.serviceModel> </configuration>
WCF为我们提供了可靠消息传递的有效机制,这个特性也是基于已有网络传输协议,WCF再次基础 上多数据通信模型进行了扩展。这种特性确实对增强我们程序的数据传递的准确性有很大的帮助,但是是否使用可靠消息传递要基于实际的项目需要,不能强制使 用。我们获得安全可靠性的同时,实际底层付出的是效率的代码。