Session_End は、起動することが保証されていません。たとえば、InProc セッションを使用していない場合、まったく起動しません。アプリケーションがリサイクルまたは停止すると、再び起動しなくなります。
最善の策は、多くの場所から呼び出すことができる共有メソッドにこのコードを含めることです。
- LoginStatusコントロールでは、LoggingOutイベントを設定できます。そこでメソッドを呼び出して、ログアウトする人を適切に処理します。
- InProc セッションを使用している場合は、Session_End イベントで、既にログアウトしているかどうかを確認してください (ご覧のとおり)。
- InProc セッションを使用していない場合は、もう少し工夫が必要です。おそらく、(Greg が述べたように) 最後にアクティブな時間がセッション タイムアウトよりも古いユーザーを通過してクリアする (おそらく、Session_Start で発生する) イベントを時々発生させることを検討してください。
残念ながら、Membership クラスはいくつかの有用な詳細を提供しますが、すべてではありません。
GetNumberOfUsersOnline
これは、「現在アプリケーションにアクセスしているユーザーの数を取得します」。-素晴らしいですが、ユーザーを獲得する唯一の方法は次のとおりです。
GetAllUsers // Gets all the users from the storage provider (can be paged)
FindUsersByName
FindUsersByEmail
残念ながら、これらのどれにも、カウントに従って「アクティブなユーザー」のみを返すプロパティはありません。
MembershipUser のメンバーを見ると、「IsOnline」プロパティはなく、LastLogonDate と LastActivtyDate のみです。Web の切断された性質のため、これはおそらくあなたが得ようとしているのと同じくらい良いものです。