我们如何检测WCF客户端何时断开连接?
有什么方法可以找出WCF客户端何时断开连接。目前唯一的方法似乎是等到服务器上的客户电话最终超时。我们如何检测WCF客户端何时断开连接?
我已经尝试订阅OperationContext.Current.Channel.Faulted事件,但不幸的是它永远不会被调用;我的理解是,这个事件应该在客户消失时被解雇。另一方面,当事件优雅地关闭OperationContext.Current.Channel.Closed时被调用。
在我们的应用程序中,我们一次只支持一个客户端连接,因此当有人关闭并重新启动客户端应用程序时,如果可以让服务器意识到断开连接,然后优雅地整理接受另一个连接。
是的,客户端大部分时间都会优雅地断开连接,但这不能得到保证。目前唯一的选择似乎是轮询客户端并等待CommunicationTimeout,这不太理想。
任何建议非常感谢。
从理论上讲,一个服务不需要有客户端的状态的知识。但它可以通过口授身份验证需求,并发限制等来坚持为谁服务。
如果您的目的是确保一次只能提供一个客户端,那么您可以简单地选择Single Concurrency模式。
例如。
[ServiceBehavior(ConcurrencyMode=ConcurrencyMode.Single)]
public class CalculatorService : ICalculatorConcurrency
这将确保一次只能提供一个客户端请求。以下链接也可以帮助你。
http://msdn.microsoft.com/en-us/library/ms731193.aspx
编辑
如果你想保持通道开放不影响其他用户的工作的用户的行动,它可能不是通常的情况。
因为每个用户的呼叫被认为是不同的会话。默认情况下,WCF调用被认为是每次调用实例化的。
如果您想在用户呼叫之间保留数据,您可以选择perSession实例化模式。
[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession)]
public class CalculatorService : ICalculatorInstance
这将确保每个用户都有一个服务实例,该实例不会中断服务其他用户。
您可以根据需要设置相应的并发模式,例如Multiple或Reentrant。即使并发模式是单一的,当一个响应被发送回给用户时,该服务将准备好为下一个用户提供服务。它不会等待客户端关闭连接。用户的连接仅用于保持会话正常。
是的,确保我们一次只服务一个客户端是没有问题的。问题在于单个客户端应用程序不正常地消失,然后被重新启动 - 它无法连接,因为服务器认为先前的实例已连接(直到它通过通信超时发现情况不是这样)。 – Richard 2011-06-08 14:55:38
好的。问题:您是否在多个用户间共享相同的数据?换句话说,如果用户A做了一些更改,用户B将能够看到它? (不要考虑更新数据库中的数据或其他内容,它只是服务中的一个问题) – SaravananArumugam 2011-06-08 15:00:06
请查看已编辑的答案以获取更多详细信息。 – SaravananArumugam 2011-06-08 15:09:34
您可以使用IChannelInitializer并挂接通道关闭和通道故障事件来检测客户端的正常关闭或突然关闭。请参阅一个非常好的职位上这个由卡洛斯 - http://blogs.msdn.com/b/carlosfigueira/archive/2012/02/14/wcf-extensibility-initializers-instance-context-channel-call-context.aspx
if (HttpContext.Current.Response.IsClientConnected == false
{
...
}
它可以帮助你
这与WCF真的有关吗? – binki 2017-05-12 18:46:31
目前我出现时,他们做的客户端上的调用和处理TimeoutExceptions。虽然这并不理想。我很想知道为什么故障事件不会发射。也许我误解了导致它开火的环境问题。 – Richard 2011-06-08 14:47:09
哦,谢谢你的链接。 – Richard 2011-06-08 14:47:23