如何制作/模拟持久TCP连接?

时间:2011-08-13 20:16:58

标签: c# .net wcf

看起来WCF TCP连接不是持久的。首次ping回复需要一段时间,但后续进程需要较少的时间。过了一段时间又需要很长时间 - 另一个重新连接?

  

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

     

客户机GT;创建到net.tcp的连接:// localhost:999 //不是真正的连接,准备连接

     

客户机GT; Ping回复1s163ms //第一次连接

     

客户机GT; Ping回复22毫秒//已连接

     

客户机GT; Ping回复26ms

     

客户机GT; Ping在24ms回复

     

客户机GT; Ping回复325ms //重新连接

     

客户机GT; Ping在19ms回复

     

客户机GT; Ping回复767ms //重新连接

如果确实如此,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消息。

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

通常情况下,WCF连接是暂时的,尽管后台有一些连接池。

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

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

同样有用的是IsInitiating属性上提供的IsTerminatingOperationContract属性。