我在我的服务器中运行了一个WCF服务,并且在针对自定义UserNamePasswordValidator进行身份验证后使用该服务的几个客户端,就像http://burcakcakiroglu.com/?p=2179中描述的那样
该服务使用以下属性实现:
[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)]
服务器主机实例化如下:
host = new ServiceHost(typeof(AsistenciaService));
host.Open();
目前,在客户端第一次进行身份验证后,他再也不需要进行身份验证(关闭客户端应用程序后除外)。
在服务器进程中,我希望-kill-所有客户端连接,因此他们必须在使用服务之前再次进行身份验证。这可能吗?
编辑:WCF服务托管在IIS服务器中。
答案 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.