【问题标题】:Detect connection failure during an async method call in a WCF service在 WCF 服务中的异步方法调用期间检测连接失败
【发布时间】:2011-04-05 11:26:44
【问题描述】:

我有一个异步 WCF 服务实现,我想检测客户端在 WCF 方法调用期间何时中止连接。

基本上,这就是我想要的:

  1. 客户端调用 WCF 方法
  2. 服务器开始异步处理请求
  3. 客户端中止连接(或连接因任何原因失败)
  4. 应通知服务器客户端已中止连接

这可能吗?

这是一个长轮询实现。或者,服务器能否确保客户端成功收到响应?如果没有,则应保存响应以供下一个轮询请求使用。

【问题讨论】:

  • 我假设您使用的是 TCP。 TCP 没有真正的方法来判断“另一端”是否还活着,除了定期发送“保持活跃”消息。一些建立在 TCP 之上的协议可以做到这一点,但不是原始 TCP,恕我直言。
  • 我认为,但是,服务器可以判断客户端是否收到响应,因为 TCP 可以检测到客户端发送的确认。

标签: c# .net wcf asynchronous long-polling


【解决方案1】:

我不知道任何可靠的方法来知道客户端是否已连接。见thisthisthis

建议的一些替代方案是使用双工通道或使用队列。基于队列的解决方案将让服务器向队列发布响应,客户端从队列中挑选这些响应。队列可以在 MSMQ、DB、Azure 中实现。

谢谢

【讨论】:

  • 根据我的经验,对这种类型的消息交换模式最可靠和最容易实现的解决方案是 @Chandermani 建议的基于 MSMQ 的选项。
  • MSMQ 不是一个选项,因为我将拥有 Linux 客户端。我想我会在考虑到这个限制的情况下重新设计我的系统。
【解决方案2】:

您可以设置一个轮询解决方案,在该解决方案中,客户端不是保持连接等待答案,而是发出请求并立即断开连接。然后每隔 X 秒重新连接一次以轮询请求是否已完成。

在服务器上,如果您在 X * 2 秒内没有看到客户端轮询,则说明客户端发生了问题,您应该中止请求。

不幸的是,要完成这项工作,服务器上需要一些额外的基础设施来跟踪哪些请求处于活动状态以及您上次看到客户端的时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多