【问题标题】:Method call on remote object never returns (.NET Remoting)远程对象上的方法调用永远不会返回(.NET Remoting)
【发布时间】:2011-07-13 12:05:43
【问题描述】:

重启远程服务器后出现问题。

  1. 客户端、服务器注册频道成功

  2. 客户端成功调用远程对象的方法

  3. 我手动重启服务器

  4. 客户端再次调用方法,但这次方法调用永远不会返回

如果客户端使用保持活动连接,我预计之前的连接会失败,并且客户端会启动另一个连接到服务器的 HTTP 通道。我尝试使用超时配置客户端通道,并将对象的生命周期设置为几秒钟,但没有任何效果。有什么想法吗?

【问题讨论】:

  • 你试过重启服务器后重启客户端吗?
  • @Koekiebox 重新启动客户端确实有效,但这不能解决我的问题。客户端旨在成为一个长时间运行的进程(实际上是一个 Windows 服务),它偶尔会通过不可靠的连接从远程服务器调用远程对象上的方法(因此预计服务器会重新启动/连接失败)。

标签: c# .net remoting .net-remoting


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我希望 .NET 远程处理有一些内置的“失败时自动重试”功能。
    猜你喜欢
    • 1970-01-01
    • 2015-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-06
    • 2017-07-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多