2009-04-29 13 views
2

我正在開發Windows應用程序。我需要在win應用程序中模擬會話(我們在網絡應用程序中),如果用戶在一段時間內處於非活動狀態,他將被註銷。用戶登錄狀態在數據庫中維護。在Windows應用程序中模擬會話

任何創新的想法?

回答

2

你不需要會話(或CallContext中,或其他任何東西),只是一個Singleton「用戶存儲」有一個限制:

用戶登錄或表現出一定的活動後,你必須保存日期/那個時間。下一次,當用戶想要做某件事時,只需比較(lastactivity + logouttime)與實際日期/時間。

過程的輪廓依稀可辨:

   [User login] 
        | 
        ! 
[User 'store' saves user date + login time] 
[This is a singleton      ] 

        ... 

[Next time user wants to do something. The ] 
[program asks user data from the user 'store'] 
        | 
        ! 
[If the actual time is greater than user  ] 
[lastactivity + LOGOUTTIME, user cannot do it] 
[If not, then update last activity   ] 

UserStore可以被實現爲字典並用作:

// Log in 
Singleton.UserStore.Add("John", new UserData(yourUserObject, DateTime.Now)); 

... 

// Check (ie. in a property-get) 
var userData = Singleton.UserStore["John"]; 
if (userData.LastActivityDate + _LOGOUTIME > DateTime.Now()) 
{ 
    throw UserAutomaticallyLoggedOut(); 
} 
else 
{ 
    userData.LastActivityDate = DateTime.Now(); 
} 
2

想到的是當定時器到達零時使用BackgroundWorker註銷用戶。該定時器在用戶進行的每個動作中都重置。或者它甚至可能被掛在鼠標或鍵盤事件上,以便當用戶不移動鼠標或不使用鍵盤時,計時器倒計時直到達到註銷時間。

+0

您可能甚至不需要爲此的BackgroundWorker - 只需使用普通的UI線程計時器。 – itowlson 2009-04-29 09:57:34

+0

你可能是對的。 :) – 2009-04-29 10:10:02

0

您可以創建應用程序中的類,它具有某種每次用戶與軟件交互時都會重置的超時值。如果達到超時,則用戶已註銷。

這裏棘手的事情是檢測用戶交互。在ASP.NET中很容易,你基本上只需要檢查頁面請求。在Windows窗體應用程序中,您需要在更詳細的級別上單擊輸入(例如,任何文本框中的任何按鍵都將是用戶交互)。我猜想KeyPreview屬性和窗體上的KeyPress事件監聽器可能是一個很好的前進方向。

0

嗯,首先,你是什麼意思非活動?在Web上,你試圖模擬沒有的狀態。但是,在客戶端應用程序中,您甚至可以獲得各種事件,甚至是MouseMove。 Onde的想法是,你可以從TextBox,Button等標準輸入控件中創建UserControls,並讓它們在調用事件時更新某種計時器對象。另一個是放棄UserControl的東西,只是更新您創建的每個事件處理程序中的計時器。基於窗體本身的MouseMove或KeyDown事件更新計時器可能會更簡單。

相關問題