2

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

该服务通过以下属性实现:

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

服务器主机实例化如下:

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

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

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

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

4

1 回答 1

0

看来您的问题是身份验证。为了实现这一点,您可以 [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode=ConcurrencyMode.Multiple)]在服务实现和 [ServiceContract(SessionMode=SessionMode.Required)]服务接口上使用。这样,InstanceContext为每个新的客户端会话创建一个新的(因此是服务对象)并在该会话的生命周期内维护(这需要支持会话的绑定)。此代码项目文章部分中的更多详细信息。

由于InstanceContextMode.PerSession服务对象的生命周期独立于客户端通道的生命周期,因此每当建立新的通信会话并在此之后处理时,这都会创建一个新的服务对象。每个客户端通道都有一个专用的服务实例,并且同一会话中的后续调用由同一服务对象处理。这是实例化上下文的默认值。这将适用于除basicHttpBinding.

您的服务(此时)是一个单例,它永远存在,并且仅在主机关闭时被处置,并且在主机创建时恰好创建一次。使用单例不需要客户端维护与单例实例的会话,或者使用支持传输级会话的绑定。如果客户端使用的合约有会话,通过关闭代理客户端只会终止会话,而不是单例实例。此外,会话永远不会过期。

于 2015-02-19T15:13:12.747 回答