2013-05-29 95 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.