2009-12-11 56 views
1

如果管理员登录到我的服务,他可能希望断开符合(或不符合)某些要求的会话,无论是自动还是手动。随着所有资源的发布,抛出异常看起来就像一个简单而有效的解决方案。一个WCF会话可能在另一个会话中抛出异常吗?

我可以使用一个本地的布尔字段,如果这是真的,他会在下次他调用任何方法时断开这个用户,但这看起来不是一个优雅的解决方案。

并且,它不必抛出异常,因为我已经注意到您可以使用OperationContext.Current.Channel.Close()或中止来禁用对该会话的访问。

有没有一个“标准”的方式在wcf中做到这一点?

+0

要考虑的一件事是即使他们结束会话阻止他们立即启动新的Web请求? – 2009-12-11 13:15:18

+0

好吧,在退出之前,你可能会得到一个警告,或者你可能会暂时禁止你的用户名,等等...... – avance70 2009-12-11 13:22:15

回答

1

从给定的“会话”中,我认为不存在对另一个会话(即实例上下文)进行任何操作的开箱即用方式。

然而,您可以通过将IChannelInitializer接口与服务或合同行为一起使用来跟踪连接到您的服务的客户端。这将使您可以访问每个客户的相关频道,然后您可以关闭该频道,但这不一定会在客户端产生非常丰富的错误,因为它看起来像是一个沟通问题。

另一种方法是查看回调,如果您有权控制正在访问该服务的客户端。通过将上述客户端跟踪与回调结合使用,您实际上可以使客户端更加优雅地关闭自己的通道,并可能向用户通知发生了什么事情。

+0

是的,忘了那个,谢谢:D - 多解释一下解决方案,我刚刚添加:SessionMode = SessionMode.Required在服务上,并且[OperationContract(IsTerminating = true)]在回调断开方法上。 – avance70 2009-12-11 13:53:52

相关问题