【问题标题】:Manually track WCF client's inactivity time手动跟踪 WCF 客户端的非活动时间
【发布时间】:2014-05-08 07:32:52
【问题描述】:

我有一个WCF 客户端需要关闭它与服务器的连接,以防超过 X 秒没有调用。 我的服务器有一个很长的inactivityTimeout,我无法更改(我可以做的唯一更改是在客户端)

阅读后我了解到我不能使用WCF's 配置来执行此操作,因此我想跟踪我的WCF 客户端手动进行的调用之间的时间。 如果客户端超过 X 秒没有拨打电话,我将关闭该连接。

我想了两种方法来实现它,但我不喜欢其中任何一种:

  1. 为我的所有函数添加一些代码,以节省调用时间。

  2. 使用IClientMessageInspector - 在这种情况下,我需要将调用时间发送到将保存此数据的外部类,并及时调用客户端,以防客户端识别到对服务器的调用已经有 X 秒没有制作了。

我正在寻找一个简单的解决方案,例如在每次调用服务器时都会调用的事件,因此跟踪断开连接的所有时间逻辑都将发生在同一个类中(WCF's 客户端代码)或者一些使用WCF's 配置的方式,因此它会在超过 X 秒不活动的情况下自动关闭连接。

我使用的绑定是netTcpBindingreliableSession

关于如何实现它的任何想法?

【问题讨论】:

  • 为什么要在通话之间保持会话打开?理想情况下,您会在每次通话后关闭连接。
  • 系统中有一个部分我无法更改,这部分也让我保存一个打开的会话,直到我的客户关闭应用程序。我遇到的问题是我不知道客户端何时关闭了应用程序,所以如果连接空闲超过 X 秒,我会尝试为他关闭连接。

标签: c# wcf wcf-client


【解决方案1】:

我几乎总是有一个方法可以返回对开放服务客户端 GetMyService 的引用。这样我就有了在一个地方实例化和打开服务的逻辑,主要是这样我就可以在开发、测试和生产环境之间可靠地切换端点。在我的设置中,进行服务调用的方法会关闭服务,但如果你把它排除在外,你就会得到你的解决方案。

有一个方法可以返回服务客户端并保留对它的引用。如果服务关闭,它将打开服务,在下一次调用该方法时,它只返回打开的服务客户端。然后你需要做的就是创建一个定时器来关闭服务并在每次调用 GetService 方法时重置它。

我无法想象您需要保持连接打开但可以“随意”关闭它的场景。除非您在打开连接时需要传递一些状态?在这种情况下,我的解决方案更有意义。我仍然怀疑您不需要保持连接打开。否则因为用户去喝咖啡而随机关闭它会破坏它。

【讨论】:

  • 感谢您的回答。但我不能在我的解决方案中使用它。我正在编写的服务从一侧连接到 WCF netTcpBinding,并将另一侧连接到 REST 服务。此服务的目的是在 REST 客户端使用它时保持与 netTcpBinding 的连接处于打开状态。我想关闭与 netTcpBinding 的连接,以防 REST 客户端在 X 秒内没有进行调用。我知道它不是“最好的”架构,但我无法改变它。
  • 仅供参考,您的 cmets 不是很有用,您说您不能使用我的答案但没有给出任何理由,您重复说您需要保持连接打开,但您没有给出原因。您似乎还可以互换使用“客户端”和“服务”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
相关资源
最近更新 更多