重温WCF之WCF中可靠性会话(十四)

时间:2023-12-24 17:24:49

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再次基础 上多数据通信模型进行了扩展。这种特性确实对增强我们程序的数据传递的准确性有很大的帮助,但是是否使用可靠消息传递要基于实际的项目需要,不能强制使 用。我们获得安全可靠性的同时,实际底层付出的是效率的代码。