【问题标题】:How to make/simulate persistent TCP connection?如何建立/模拟持久的 TCP 连接?
【发布时间】:2011-10-26 13:11:48
【问题描述】:

看起来 WCF TCP 连接不是持久的。第一次 ping 回复需要一段时间,但后续过程需要的时间更少。过了一会儿又需要很长时间 - 再次重新连接?

SERVER> 开始于 net.tcp://0.0.0.0:999

CLIENT> Connection created to net.tcp://localhost:999 //不是真正的连接,准备连接

CLIENT> Ping 1s163ms 回复 //第一次连接

CLIENT> Ping 22ms 回复 //已经连接

CLIENT> 26ms 内 Ping 回复

CLIENT> 24ms 内 Ping 回复

CLIENT> 325ms 内 Ping 回复 //重新连接

CLIENT> 19ms 内 Ping 回复

CLIENT> 767ms 内 Ping 回复 //重新连接

如果是真的,tcp 连接在断开之前的空闲时间值是多少?我需要保持连接有效。

更新修改代码:

NetTcpBinding tcpBind = new NetTcpBinding();
tcpBind.ReliableSession.Enabled = true;
tcpBind.ReliableSession.Ordered = true;
tcpBind.ReliableSession.InactivityTimeout = TimeSpan.FromMinutes(10);

ServiceHost svh = new ServiceHost(typeof(ServiceImplementation));
svh.AddServiceEndpoint(
    typeof(WCFSimple.Contract.IService),
    //new NetTcpBinding(),
    tcpBind,
    String.Format("net.tcp://{0}:{1}", ip, port));
svh.Open();

现在我又遇到了一个错误:

此端点不支持http://tempuri.org/IService/Pong 操作。此端点仅处理 WS-ReliableMessaging 2005 年 2 月的消息。

更新我只修改了服务器端,它导致了错误。然后我将客户端的 TCP 修改为可靠的消息传递。

【问题讨论】:

  • 真实世界的测试:在 3 秒内,ping 回复的间隔约为 100 毫秒。如果间隔为 60 秒,则回复约为 500 毫秒,再加上 1 秒 520 毫秒(可能重新连接)
  • 我想我需要启用那个超时:reliableSession > enable = true; inactivityTimeout = 10s;

标签: c# .net wcf


【解决方案1】:

我认为 Ping 不是测试 TCP 连接的好工具。因为 Ping 使用 ICMP 作为其底层协议而不是 TCP。

我建议你创建一个 WCF 客户端,连接到服务,然后通过一些网络嗅探工具检查 TCP 连接,或者简单地使用 netstat 进行快速检查。

【讨论】:

  • 它不是ICMP,它是标准的WCF服务,只是名字是Ping。客户端发送时间,服务器返回值。
【解决方案2】:

通常,WCF 连接是暂时的,但在后台会进行一些连接池。

使用 net.tcp 作为传输,持久(长期)连接是可能的。您发布的代码是实现这一目标的一种方法。

有关更多信息和一些替代方案,请查看 What You Need To Know About One-Way Calls, Callbacks, And Events,这是 2006 年 10 月的 MSDN 杂志文章。

IsInitiatingIsTerminating 属性也可用于 OperationContract 属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-15
    • 2012-11-11
    • 1970-01-01
    • 2013-03-19
    • 2014-09-08
    • 1970-01-01
    • 1970-01-01
    • 2019-03-04
    相关资源
    最近更新 更多