gpt4 book ai didi

wcf - 保持 wcf 回调 channel 无限期打开/如果出现故障则从客户端重新连接

转载 作者:可可西里 更新时间:2023-11-01 02:29:56 26 4
gpt4 key购买 nike

我目前正在尝试设置这样的东西:

  • 服务器端 Windows wcf 服务挂起并通过 tcp 监听来自客户端 Windows 服务的连接。
  • 当收到连接(客户端调用服务的 CheckIn 方法)时,服务通过 OperationContext.Current.GetCallbackChannel 获取回调 channel
  • 此 channel 连同唯一键一起存储在一个集合中(具体来说,我将回调接口(interface)、 channel 和键存储在 List 中,其中每一个都是一个属性)
  • 现在应该可以根据所述唯一 key 将调用传递给该客户端服务

这起初有效,但过了一会儿就停止了——我无法再将调用传递给客户。我假设这是因为连接已在内部断开,我正在尝试使用死连接。

考虑到这一点,我有以下问题:

  • 我如何告诉 wcf 我想无限期地(或尽可能长时间地)保持这些 TCP 连接?
  • 我如何从客户端检查我与服务器的连接是否仍然有效,以便在我的连接失效时我可以放弃它并再次检查服务器?

我能想到一些笨拙的解决方案,但我希望这里有人能告诉我正确的方法。

最佳答案

当您从客户端建立连接时,您应该在您的 tcp 绑定(bind)中设置两个超时值(您将传递给 ClientBase<> 或 DuplexClientBase<> 的绑定(bind)):

NetTcpBinding binding = new NetTcpBinding();
binding.ReceiveTimeout = TimeSpan.FromHours(20f);
binding.ReliableSession.InactivityTimeout = TimeSpan.FromHours(20f);

我的示例使用 20 小时超时,您可以使用对您有意义的任何值。然后 WCF 将尝试在这段时间内保持您的客户端和服务器连接。默认设置相对较短(大概 5 分钟?),可以解释连接中断的原因。

每当客户端和服务器之间出现通信问题(包括 WCF 本身丢弃 channel )时,WCF 都会在客户端中引发 Faulted 事件,您可以处理该事件以执行您认为合适的任何操作。在我的项目中,我将我的 DuplexClientBase<> 派生对象转换为 ICommunicationObject 以获取 Faulted 事件并将其转发到我的类中公开的名为 OnFaulted 的事件:

ICommunicationObject communicationObject = this as ICommunicationObject;
communicationObject.Faulted +=
new EventHandler((sender, e) => { OnFaulted(sender, e); });

在上面的代码片段中,this 是我的 WCF 客户端类型的一个实例,在我的例子中,它派生自 DuplexClientBase<>。您在此事件中所做的是特定于您的应用程序的。在我的例子中,该应用程序是一个非关键 UI,因此如果出现 WCF 错误,我只需向最终用户显示一个消息框并关闭该应用程序——如果它总是如此简单,那将是一个美好的世界!

关于wcf - 保持 wcf 回调 channel 无限期打开/如果出现故障则从客户端重新连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5405930/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com