gpt4 book ai didi

wcf - 如果服务器断开连接,如何检测客户端?

转载 作者:行者123 更新时间:2023-12-03 15:03:03 25 4
gpt4 key购买 nike

我有一个带有 net.tcp DuplexChannel 的 WCF 自托管服务。在服务器上,我运行以下命令来断开客户端的连接:

((ICommunicationObject)client.CallbackChannel).Close();

这工作正常,但如何在客户端上检测到它已断开连接?

我在回调的 InstanceContext 和到服务器的 channel 上都连接到 Closed 和 Faulted-events:
InstanceContext callback = new InstanceContext(callbackImp);
callback.Closed += new EventHandler(callback_Closed);


((ICommunicationObject)Channel).Closed += new EventHandler(Channel_Closed);

但没有任何作用。我从来没有得到通知。我现在使用的解决方法是在回调中有一个方法来触发与客户端的断开连接。但我宁愿不这样做。我特别不想让服务器等待用户断开连接。

编辑

我刚刚意识到,当与客户端断开连接时,我在服务契约(Contract)中运行了一个方法,该方法标有 IsTerminating = true:
[OperationContract(IsTerminating = true)]
void Disconnect();

我想那在回调契约(Contract)上会是一样的吗?我尝试将相同的方法添加到我的回调中,它确实从服务器的角度终止了回调 channel ,但我仍然没有在客户端收到通知......奇怪

编辑

我发现了一些关于此的更多信息:

When the server aborts the callback channel, a fault travels back to the client, the client faults and we get the Faulted event on the client.

When the server closes the callback channel, the session is still open until the client issues the close.

Once the client closes the channel you'll see the Closed event.



根据这个声明,关闭事件不是通过从服务器关闭回调 channel 来触发的,客户端也必须关闭它。因此,我可以在回调的终止 Disconnect 方法中在客户端上运行 Close。或者我可以在回调服务器端使用 Abort-method 并跳过在回调上使用 Disconnect-method。我不知道老实说我更喜欢哪一个。嗯嗯。

编辑

我采用了中止方法。这似乎是最合乎逻辑的方法,而且效果很好。客户端收到回调实例上下文中的故障事件通知。好的。

最佳答案

我采用了中止方法。这似乎是最合乎逻辑的方法,而且效果很好。客户端收到回调实例上下文中的故障事件通知。

关于wcf - 如果服务器断开连接,如何检测客户端?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4317754/

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