如何从ServiceHost中终止所有当前客户端连接?

时间:2013-05-29 22:58:02

标签: c# wcf

我在我的服务器中运行了一个WCF服务,并且在针对自定义UserNamePasswordValidator进行身份验证后使用该服务的几个客户端,就像http://burcakcakiroglu.com/?p=2179中描述的那样

该服务使用以下属性实现:

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

服务器主机实例化如下:

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

目前,在客户端第一次进行身份验证后,他再也不需要进行身份验证(关闭客户端应用程序后除外)。

在服务器进程中,我希望-kill-所有客户端连接,因此他们必须在使用服务之前再次进行身份验证。这可能吗?

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

1 个答案:

答案 0 :(得分:0)

您的问题似乎是身份验证。为此,您可以在服务实现上使用[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode=ConcurrencyMode.Multiple)],在服务界面上使用[ServiceContract(SessionMode=SessionMode.Required)]。这样,为每个新客户端会话创建一个新的InstanceContext(以及因此服务对象),并在该会话的生命周期内维护(这需要一个支持会话的绑定)。 this code project article section中的更多详细信息。

使用InstanceContextMode.PerSession服务对象的生命周期与客户端通道的生命周期无关,因此每当建立新的通信会话并在此之后进行处理时,这将创建新的服务对象。每个客户端通道都获得一个专用服务实例,同一会话中的后续调用由同一个Service对象处理。这是实例化上下文的默认值。这将适用于除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.