0

我有一个小型客户端/服务器应用程序。我使用手动编码的 TCP 连接来允许客户端控制服务器,但现在我已将其转换为 WCF。这为我节省了一大堆代码,但它也给了我一系列全新的问题需要解决......

最新的问题是,过了一会儿,服务器断开了客户端。在任何情况下,我都不希望这种情况发生。目前,客户端运行了大约四分之一,然后因为服务器断开连接而爆炸。我需要阻止这种情况发生。

我能够编写一个简单的 WCF 客户端/服务器对来复制问题。似乎如果客户端调用一个方法,等待 15 分钟,然后调用第二个方法,第二个调用会抛出一个异常,喋喋不休地说套接字已关闭。如果我减少延迟,一切正常。

我在另一个答案中读到设置ReceiveTimeout应该解决这个问题。但是,当我尝试时,这只解决了.NET下的问题;在 Mono 下运行时,它仍然会中断。由于 Mono 是实际的目标平台,因此这不是很有帮助。

(想想 SSH - 你希望 SSH 服务器仅仅因为你有一段时间没有输入任何东西就断开你的连接。也许你发出了一个长时间运行的 shell 命令或其他东西......只是因为服务器没有收到任何来自您的数据并不意味着什么都没有发生!这当然并不意味着您的连接应该被丢弃......)

所有代码都是 C#。服务器是一个自托管控制台应用程序。客户端也是一个控制台应用程序。所有配置都在代码中。绑定是NetTcpBinding默认设置。

我该怎么做才能让客户端成功运行完成?

我有一些想法,但没有一个是漂亮的:

  • 手动发送心跳消息。(呸!)
  • 检测断开连接并自动重新连接?(再次,糟糕。)
  • 开启“可靠模式”。(我猜由于服务器故意结束会话,这无济于事。)
  • 每个方法调用创建一个连接。(这将是相当多的代码......)
  • 停止使用 WCF?
4

1 回答 1

0

最后,我通过让客户端为每个命令建立一个新连接来“修复”这个问题。这是可以接受的,因为客户端并不经常发送命令。不得不多次编写连接/断开代码很烦人......

于 2013-11-08T20:19:11.440 回答