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

标签 wcf

有没有办法找出 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/

相关文章:

javascript - 根级别的数据无效。使用 ajax wcf 服务,但无法弄清楚

WCF REST : Case insensitive Query String Parameters, 建议的命名约定 - 使用下划线还是?

c# - 在调用期间在 WCF 服务中创建后台线程是否会占用 ASP .NET 线程池中的线程?

c# - 如何在 C# WCF REST POST 中的 StreamReader.ReadToEnd() 之后抛出 WebFaultException?

.net - 超出了传入邮件的最大邮件大小配额(65536)

wcf - https 带有 WCF 错误 : "Could not find base address that matches scheme https"

wcf - IIS 上的 WCF 服务出现 HTTP 错误 403.1

asp.net - 在 DMZ 中运行安全 WCF 服务时出现问题

c# - 套接字连接已中止 - CommunicationException

WCF 服务 - 无 global.asax