2011-03-11 42 views
2

重新启动远程服务器后出现问题。远程对象上的方法调用永远不会返回(.NET Remoting)

  1. 客户端,服务器注册自己的频道成功

  2. 客户成功地调用方法远程对象上

  3. 我手动重新启动服务器

  4. 客户再次调用方法,但此时方法调用永不返回

如果客户端正在使用保持连接状态,我会希望以前的连接失败,并且客户端启动另一个连接到服务器的HTTP通道。我尝试用超时配置客户端通道,并将对象的生命周期设置为几秒钟,但没有任何工作。有任何想法吗?

+0

您是否尝试过重新启动服务器后重新启动客户端? – Koekiebox 2011-03-11 13:30:34

+1

@Koekiebox重新启动客户端肯定有效,但这不是我的问题的解决方案。客户端旨在成为一个长期运行的进程(实际上是一个windows服务),它偶尔会通过不可靠的连接从远程服务器调用远程对象上的方法(因此服务器重新启动/连接失败)。 – lzm 2011-03-11 13:47:53

回答

1

我建议转移到WCF,这是一个更好的支持技术在这种情况下。在这种情况下,WCF的行为是检测每个RPC调用中断的连接并返回一个异常。它没有任何内置的重试逻辑,您必须将您的客户端代码包装在提交重试的异常处理中。至少它不会挂起,不会返回,因此您不必编写自己的超时/取消处理代码。

请注意,WCF连接周期可能很长(启用IPv6的客户端需要约30秒的连接时间,因为服务器异常断开连接而断开的已建立连接需要60秒),因此如果您需要检测一个断开的连接比这个更紧密,你仍然需要编写你自己的超时/取消逻辑。例如,如果您正在执行网络RPC以响应用户更新UI的操作,则可能需要比30-60秒更短的超时窗口。请小心使其过短,因为IPv6连接有时需要20-30秒才能成功协商连接。这是由于基本TCP/IP连接背后的所有IPv6/IPv4兼容性/调谐协商。

1

客户端正在使用不再连接的远程对象代理。据我所知,没有任何体面的违约行为。您必须在每次通话前检查远程状态并创建一些超时代码。

+0

我希望.NET Remoting有一些内置的“自动重试失败”功能。 – lzm 2011-03-11 15:27:18

相关问题