看起来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修改为可靠的消息传递。
答案 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属性上提供的IsTerminating和OperationContract属性。