一个现实的需求:
一个wcf net.tcp连接会在10分钟后超时,然后断开了连接 (复现方式是:通讯一次就不再动作),你必须重启客户端程序。
在WCF中,net.tcp连接的超时设置可以在服务配置文件中进行调整。以下是一些可能有用的信息和建议:
超时设置:
在WCF服务的配置文件中,可以设置连接超时时间。以下是一个示例配置:
<bindings> <netTcpBinding> <binding name="myTcpBinding" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="09:01:00" sendTimeout="00:01:00"> <reliableSession enabled="true" /> </binding> </netTcpBinding> </bindings>
在这个示例中,receiveTimeout属性设置为9小时1分钟,这是连接超时的时间。
连接超时原因:
连接超时可能是由于多种原因导致的,例如网络不稳定、服务器负载过高、客户端或服务器崩溃等。
还有一情况就是上面的超时设定的时间到了。
为了避免连接超时,可以采取以下措施:
定期发送心跳消息,以保持连接活跃。
优化服务器性能,确保服务器能够处理大量并发连接。
使用负载均衡器分发客户端请求,以减轻单个服务器的负担。
使用断线重连机制
对于长时间运行的连接,可以考虑使用持久连接,以减少连接建立和关闭的开销。
上面的策略中,持久连接这个在wcf是不存在的,因为wcf是基于消息的通讯。
你只能通过策略来模拟持久连接的效果。
主要策略是:
1。 通过netTcpBinding的配置项 closeTimeout、openTimeout、receiveTimeout和sendTimeout
2。 实现断线重连机制
勇哥这里首先是尝试实现断电重连机制。
(一)把基础程序的binding改为tcp方式
修改app.config的配置项目。
Hosting:
<endpoint address="net.tcp://127.0.0.1:9991/calculatorservice" binding="netTcpBinding" contract="Contracts.ICalculator" />
Client:
<endpoint address="net.tcp://127.0.0.1:9991/calculatorservice" binding="netTcpBinding" contract="Contracts.ICalculator" name="calculatorservice" />
<endpoint>标签中的binding属性,常见的几种取值如下:
netNamedPipeBinding 同一电脑上的进程间的命名管道通讯
netTcpBinding 跨电脑进行tcp通讯
wsHttpBinding 跨平台的http通讯
binding属性中完整的取值列表见下表中的红框部分:
以上这些绑定类型的详细属性:
其中关于”可靠消息传输“和”事务流“中,取值为”禁用“、”启用“的是指它的缺省值。
如果此绑定类型支持”可靠的消息传输“和”事务流“,那么可以进行配置为”启用“。
(图2)
关于”可靠的消息传输“
可靠的消息传递是:禁用”时,这意味着WCF服务不会使用任何特定的机制来确保消息的可靠性。这意味着:
无重试:如果消息在传输过程中丢失或损坏,服务或客户端不会自动重试发送或接收该消息。
无确认:服务不会向客户端发送确认消息已收到的消息,因此客户端不知道消息是否已被成功接收。
无顺序保证:即使消息按顺序发送,也不能保证它们会按顺序到达。
对于常见的NetTcpBinding,以下是它的”可靠的消息传递“一些关键点:
默认设置:默认情况下,NetTcpBinding可能并不直接启用可靠性会话功能。
但WCF的可靠性会话是一个SOAP可靠消息传递的实现,可以在绑定层保证消息只会被传送一次,
并能确定消息之间的传输顺序。
可靠性会话功能:通过配置NetTcpBinding,可以启用可靠性会话功能。
这样,在连接掉线的情况下,它会重新连接服务器,连接次数可在配置文件中设定。
当连接失败时,能自动释放对话所占用的资源。
配置方式:可靠性会话功能可以通过代码绑定,也可以通过config配置统一绑定。
但值得注意的是,服务器端与客户端的配置必须保持一致,以避免出现冲突。
与其他绑定的比较:与wsHttpBinding、wsFederationBinding不同,
NetTcpBinding在默认情况下可能不启用可靠性会话功能。
而wsDualHttpBinding和netNamedPipesBinding则默认支持可靠性功能。
下一节我们就来重点研究一下NetTcpBinding的”可靠的消息传输“。
(二)配置NetTcpBinding通讯超时,启用”可靠的消息传输“
先启用可靠的会话。
<reliableSession enabled="true" />
<netTcpBinding> <binding name="NewBinding0" receiveTimeout="00:01:00"> <reliableSession enabled="true" /> <security mode="None" /> </binding> </netTcpBinding>
再拔网线,立刻插上,然后Add。
这次终于没有报错了,通讯可以继续!!
再试下拔下网线后,先点一次Add,然后再插上网线。
结果等了一会后,数据续传了!
看来靠着“可靠的消息传送”机制,可以防止意外网络中断。
最后的一种情况,拔了网线后,一直不插回去会怎么样呢?
估计到达一个阈值后,会报tcp会话失败。但是这个阈值是多少,就留给有兴趣的朋友去试吧。
然鹅~ 并不是所有的binding都支持“可靠的消息传送”的,具体见图2。
实验代码下载:
链接:https://pan.baidu.com/s/1kjNElNwe4HeO-9Xyjn5H2A
提取码:9e67
--来自百度网盘超级会员V6勇哥的分享

