2013-05-29 59 views
2

我在我的服务器上运行的WCF服务,以及一对夫妇谁验证自己免受定制UserNamePasswordValidator后,消费服务,就像在http://burcakcakiroglu.com/?p=2179如何从ServiceHost中终止所有当前客户端连接?

描述的该服务具有以下属性来实现客户端:

[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)] 

服务器主机实例如下:

host = new ServiceHost(typeof(AsistenciaService)); 
host.Open(); 

目前,后一个客户,他尼夫认证第一时间r必须再次进行身份验证(关闭客户端应用程序后除外)。

在服务器过程中,我想-kill-所有客户端连接,所以他们使用了该服务之前再次进行身份验证。这可能吗?

编辑:WCF服务在IIS服务器托管。

+1

你收留了它作为一个单身,那么为什么不干脆用'host.Close();'? – Tim

+0

这将工作蒂姆,但我希望该服务保持开放,为新的输入连接(我需要踢出所有当前用户,但允许新用户连接)。 – DanyAlejandro

+0

不确定你最终的目标是 - 你想让客户除了连接之外还必须在每次通话时提供某种认证吗?或者你想在一段时间后启动它们? – Tim

回答

0

看来你的问题是认证。为了实现这一点,您可以在服务接口上使用[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode=ConcurrencyMode.Multiple)],在服务接口上使用[ServiceContract(SessionMode=SessionMode.Required)]。这样,一个新的InstanceContext(并且因此服务对象)对每个新的客户端的会话创建和维护该会话的生存期(这需要结合支持会话)。更多详细信息在this code project article section

使用InstanceContextMode.PerSession服务对象的生存时间与客户端通道的生存时间无关,所以无论何时建立新的通信会话并在此之后处理,都会创建新的服务对象。每个客户端通道都获得一个专用的服务实例,并且同一会话中的后续呼叫由相同的服务对象处理。这是实例化上下文的默认值。这将与除basicHttpBinding以外的所有绑定一起使用。

您的服务(此时)是一个单,它永远活着,一旦主机关闭创建主机时创建恰好一次只处理。 使用单例不需要客户端维护与单例实例的会话,也不需要使用支持传输级会话的绑定。 If the contract that the client consumes has a session, by closing the proxy the client will only terminate the session, not the singleton instance. In addition, the session will never expire.