gpt4 book ai didi

wcf - 我们如何检测 WCF 客户端何时断开连接?

转载 作者:行者123 更新时间:2023-12-04 14:42:06 26 4
gpt4 key购买 nike

有没有办法找出 WCF 客户端何时断开连接。目前唯一的方法似乎是等到来自服务的客户端调用最终超时。

我曾尝试订阅 OperationContext.Current.Channel.Faulted 事件,但不幸的是它从未被调用;我的理解是当客户端消失时应该触发这个事件。另一方面,当事情正常关闭时 OperationContext.Current.Channel.Closed 被调用。

在我们的应用程序中,我们一次只支持一个客户端连接,因此当有人关闭并重新启动客户端应用程序时,如果服务器可以知道断开连接,优雅地整理然后接受另一个连接,那就太好了。

是的,客户端大部分时间会正常断开连接,但这不能保证。目前唯一的选择似乎是轮询客户端并等待 CommunicationTimeout,这并不理想。

任何建议都非常感谢。

最佳答案

理论上,服务不需要知道客户端的状态。但是它可以通过指定身份验证需求、并发限制等来坚持为谁服务。

如果您打算确保一次只为一个客户端提供服务,您可以简单地选择单并发模式。

例如。

[ServiceBehavior(ConcurrencyMode=ConcurrencyMode.Single)] 
public class CalculatorService : ICalculatorConcurrency

这将确保一次只处理一个客户端请求。以下链接也可能对您有所帮助。

http://msdn.microsoft.com/en-us/library/ms731193.aspx

编辑

如果您认为某个用户保持 channel 打开的行为确实干扰了其他用户的工作,则可能不是通常的情况。

因为每个用户的调用都被认为是一个不同的 session 。默认情况下,WCF 调用被视为每次调用都实例化。

如果您想在用户调用之间保留数据,您可以选择 perSession 实例化模式。
[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession)] 
public class CalculatorService : ICalculatorInstance

这将确保每个用户都有一个不会中断服务其他用户的服务实例。

如果您愿意,您可以相应地设置并发模式,即 Multiple 或 Reentrant。即使并发模式是单一的,当响应被发送回用户时,服务将准备好为下一个用户服务。它不会等待客户端关闭连接。用户的连接仅对保持 session 事件有用。

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

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