2009-07-14 9 views
4

そのサイトでオンラインにいる人の数を表示する必要があります。このサイトはASP.NET 2.0を使用して開発されています。現在、私はGlobal.asaxでセッション開始(1増加)と終了終了(1減少)を使用しています。しかし、Session_Endイベントは、ほとんどの時間正しく呼び出されません。これを達成するためのより良い方法はありますか?ウェブサイトでオンラインにいる人の数を確認する方法

+0

いずれかのASP.NETメンバーシッププロバイダを使用していますか? SqlMembershipProviderなど? –

答えて

3

私たちはいくつかの方法を試した後、各ユーザのトラッキングアイドル時間で終了します。アイドル時間がセッションタイムアウトを超えた場合、ユーザはオンラインではないとみなします。もちろん、ユーザーのログオフやタイムアウト後に再度ログインするなどの他の問題も考慮する必要があります。

5

Session_Startでインクリメントし、使用しない限りSession_Endでデクリメントします。データベースのような他の手段。

リクエストを認証するときに、データベースのタイムスタンプを更新して、ユーザーがアクティブであることを示すことができます。一定の時間(たとえば15分)後に、同時ユーザー数を収集するクエリは、 (したがって、カウントを減少させる)。

4

急いでGoogle検索でHttpModuleでhandy way of doing thisが公開されました。

全体として、ヨハンはこれで素晴らしい仕事をしました。上記で提案された設定タイムアウトを実装していますが、それ以外の場合は、サーバーのperfmon.exeをチェックし、WebService >> WebAppPoolの現在の接続数をチェックする以外に、これを正確に行う方法はありません。

これを自分で実装したとき、SQL Serverテーブルを使用して日付/時刻と認証に関するユーザー情報を格納しました。私は、データキャッシュをリフレッシュしなければならないときはいつでも(10分ごとに1回)、IPアドレスを再解析して一致させることによってカウントを減らしました。

+0

+1それは非常に健全なアプローチのように聞こえる。 Webサーバーの実装には、SQL Serverをバッキングストレージとして使用する必要があります(セッションストアにVelocityのようなものを使用しない限り)。将来の実験のためにブックマークされています。ありがとう! –

3

私は以前これを行っており、セッションを手動で破棄した場合にのみSession_Endが呼び出されることを証明できます(Session.Abandon)。あなたがそれについて考えるとき、それは理にかなっています。ユーザーがウェブサイトにいない場合、コードは決して実行されません。

私が行ったことは、ユーザーがサイトで最後に見たときのユーザー名と日時を含むアプリケーション状態でハッシュテーブルを格納していたことです。すべてのページの読み込みのために、私は現在のユーザーのためにこの値を挿入または更新する関数を呼び出します。次に、リスト全体を削除し、セッションタイムアウト(20分など)よりも古いエントリをすべて削除します。このリストを変更するときは、競合状態を避けるためにロックまたは同期を使用することを忘れないでください。

これには、人数を知るだけでなく、特定のユーザーを知るという利点があります。

ユーザー名のような固有のものがない場合は、代わりにSession.SessionIDを使用できます。それはあなたのサイトの訪問者ごとに一意でなければなりません。

しかし、アプリケーションまたはアプリケーションインスタンスの状態変数には、「Webガーデンモード」のプロセス間またはマルチサーバー設定のプロセス間で共有されない問題があるため、注意してください。大規模な設定には、データベースや分散キャッシュなどのより永続的なメディアが必要です。

関連する問題