質問
Windowsアプリケーションで作業しています。ユーザーが一定期間アクティブでない場合、ログオフされるwinアプリでセッション(Webアプリにある)をシミュレートする必要があります。ユーザーのログイン状態はデータベースで維持されます。
革新的なアイデア???
解決
セッション(またはCallContextなど)は必要なく、シングルトン"ユーザーストア" 1つの制限があります:
ユーザーがログインまたはアクティビティを表示した後、その日付/時刻を保存する必要があります。次回、ユーザーが何かをしたいときは、(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は Dictionary として実装し、次のように使用できます。
// 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();
}
他のヒント
思い浮かぶのは、BackgroundWorkerを使用して、タイマーがゼロになったときにユーザーをログオフすることです。このタイマーは、ユーザーが行うすべてのアクションでリセットされます。または、マウスまたはキーボードイベントにフックして、ユーザーがマウスを動かさなかったり、キーボードを使用していないときに、ログオフ時間に達するまでタイマーがカウントダウンするようにすることもできます。
ユーザーがソフトウェアを操作するたびにリセットされる、ある種のタイムアウトを持つクラスをアプリケーションに作成できます。タイムアウトに達すると、ユーザーはログアウトされます。
ここで注意が必要なのは、ユーザーの操作を検出することです。 ASP.NETでは非常に簡単です。基本的には、ページリクエストのみを確認する必要があります。 Windowsフォームアプリケーションでは、より詳細なレベルで入力を監視する必要があります(たとえば、テキストボックスでキーを押すと、ユーザー操作が行われます)。 KeyPreviewプロパティとフォーム上のKeyPressイベントリスナーを一緒に使用するのがよい方法だと思います。
さて、最初に、非アクティブとはどういう意味ですか? Web上では、状態がない状態をシミュレートしようとしています。ただし、クライアントアプリでは、MouseMoveでさえあらゆる種類のイベントを取得します。 Ondeのアイデアは、TextBoxやButtonなどの標準入力コントロールからUserControlを作成し、イベントが呼び出されたときに何らかのタイマーオブジェクトを更新できるようにすることです。もう1つの方法は、UserControlの代わりに、作成した各イベントハンドラーのタイマーを更新することです。おそらく、フォーム自体のMouseMoveイベントまたはKeyDownイベントに基づいてタイマーを更新する方が簡単でしょう。