wcf(2):NetTcpBinding的 ”可靠的消息传输“机制


一个现实的需求:

一个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属性中完整的取值列表见下表中的红框部分:

image.png


以上这些绑定类型的详细属性:

其中关于”可靠消息传输“和”事务流“中,取值为”禁用“、”启用“的是指它的缺省值。

如果此绑定类型支持”可靠的消息传输“和”事务流“,那么可以进行配置为”启用“。

image.png

(图2)

image.png


关于”可靠的消息传输“


可靠的消息传递是:禁用”时,这意味着WCF服务不会使用任何特定的机制来确保消息的可靠性。这意味着:


  • 无重试:如果消息在传输过程中丢失或损坏,服务或客户端不会自动重试发送或接收该消息。

  • 无确认:服务不会向客户端发送确认消息已收到的消息,因此客户端不知道消息是否已被成功接收。

  • 无顺序保证:即使消息按顺序发送,也不能保证它们会按顺序到达。


对于常见的NetTcpBinding,以下是它的”可靠的消息传递“一些关键点:


默认设置:默认情况下,NetTcpBinding可能并不直接启用可靠性会话功能。

但WCF的可靠性会话是一个SOAP可靠消息传递的实现,可以在绑定层保证消息只会被传送一次,

并能确定消息之间的传输顺序。


可靠性会话功能:通过配置NetTcpBinding,可以启用可靠性会话功能。
这样,在连接掉线的情况下,它会重新连接服务器,连接次数可在配置文件中设定。
当连接失败时,能自动释放对话所占用的资源。


配置方式:可靠性会话功能可以通过代码绑定,也可以通过config配置统一绑定。
但值得注意的是,服务器端与客户端的配置必须保持一致,以避免出现冲突。


与其他绑定的比较:与wsHttpBinding、wsFederationBinding不同,
NetTcpBinding在默认情况下可能不启用可靠性会话功能。
而wsDualHttpBinding和netNamedPipesBinding则默认支持可靠性功能。



下一节我们就来重点研究一下NetTcpBinding的”可靠的消息传输“。



(二)配置NetTcpBinding通讯超时,启用”可靠的消息传输“


先启用可靠的会话。

<reliableSession enabled="true" />


Markup
            <netTcpBinding>
                <binding name="NewBinding0" receiveTimeout="00:01:00">
                    <reliableSession enabled="true" />
                    <security mode="None" />
                </binding>
            </netTcpBinding>

再拔网线,立刻插上,然后Add。

这次终于没有报错了,通讯可以继续!!

image.png

再试下拔下网线后,先点一次Add,然后再插上网线。

结果等了一会后,数据续传了!

image.png

看来靠着“可靠的消息传送”机制,可以防止意外网络中断。

最后的一种情况,拔了网线后,一直不插回去会怎么样呢?

估计到达一个阈值后,会报tcp会话失败。但是这个阈值是多少,就留给有兴趣的朋友去试吧。


然鹅~ 并不是所有的binding都支持“可靠的消息传送”的,具体见图2。



实验代码下载:

链接:https://pan.baidu.com/s/1kjNElNwe4HeO-9Xyjn5H2A 

提取码:9e67 

--来自百度网盘超级会员V6勇哥的分享



本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:
本帖最后由 勇哥,很想停止 于 2024-06-13 10:12:50 编辑

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2025年4月    »
123456
78910111213
14151617181920
21222324252627
282930
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864