2009-11-30 12 views
5

私のサイトには現在オンラインのユーザー数が常に表示されるという要件があります。たとえば、「35741ユーザーは現在オンライン」です。これはログインに基づいているのではなく、現在自分のサイトにいるユーザーの数だけです。セッション開始/セッション終了を使用しようとしましたが、セッション終了は信頼できません。したがって、私のセッション開始は数字を追加しますが、セッション終了は起動しないため、セッション終了はそれらを削除しません。現在のオンラインユーザーを追跡する最良の方法

これから収集する追加情報はありません(報告など)。単に数字が表示されるように要求されています。非常にシンプルな要求は、大きな問題になっています。どんな助けもありがとうございます。

EDIT:

私はまた、このためのデータベースを使用して試してみましたことを指定する必要があります。セッションIDと最後のアクティビティ列を含むシンプルなテーブル。各ページがヒットしたら、セッションが自分のデータベースにあるかどうかをチェックします。そうでない場合は、挿入します。その場合は、活動時間で更新してください。その後、過去20分間にアクティビティのないセッションを探してデータベースを掃除する手順を実行します。このアプローチは、私のSQLサーバーやIISを殺すように思えました。サイトを再起動しなければならなかった。

+2

あなたの最大の賭けはランダムです。他のすべては信頼できるほどです。 –

+0

@YuriyFaktorovich、技術的に真実:) –

答えて

8

ベスト・ウェイはあなたのようなものですが、アクティビティを通してタイムアウトしてください。特定のセッションが5分以内にページにアクセスしない場合は、それらがアクティブでなくなったとみなすことができます。

+2

+1 \t私は同じことを書いていた –

+0

ちょうど私が入力するヒットしようとしていた... – Dave

+0

私は同じことを書きました! – Larsenal

2

録音できるすべてのユーザー操作について、特定の時間枠で「オンライン」と考える必要があります。サイトによっては、5分に設定することができます。実際のウェブリクエストは1秒未満で済むはずです。 とすると、そのページにどれくらいの期間滞在してオンラインと見なされるかについての前提があります。

このアプローチでは、各ユーザーの最後のアクティビティの時間を追跡する必要があります。

2

使用Performance Counters:アクティブ

  • 状態サーバーセッション:アクティブなユーザーセッションの 数。
3

あなたはASP.Netメンバーシップを使用している場合は、GetNumberOfUsersOnlineを見てみましょう。

+0

OP: "これは**ログインに基づいていません"、 "Membership.GetNumberOfUsersOnline"はログインしているユーザーに基づいています。 –

0

エキスパンドシルキーは答えました - 実際にhttpはステートレスなので、ユーザーは現在「オンライン」かどうかを判断できます。ユーザーが最後にサイトにアクセスしてからの所要時間を追跡し、あなたはまだアクティブであると考えます。

ログインしたユーザーに基づいているわけではありませんが、これは過去5分間にリクエストを受信したIPアドレスの数(単純に「オンライン」タイムアウトとみなされます) 。

0

セッションを別のセッションにする必要がある場合を除き、セッションを使用しないでください。そうでなければ過労です。

このような何か、シングル・サーバーのインストールと仮定すると:静的ユニークIDの表とそれらの最終アクセス時間を維持するユニークなID

  • が含まれているクッキーを発行し、ユーザーごとに

    1. HttpModule(またはGlobal.asax)では、新しいユーザーをテーブルに入力し、アクセス時間を更新します(競合状態を防ぐために適切なロックを使用します)。
    2. 定期的に、バックグラウンドスレッドまたはユーザー要求、テーブルからエントリを削除する最後のN分以内にリクエストをしていないまた、明示的な「ログアウト」機能をサポートすることもできます。
    3. レポートオンライン人々の数テーブルのサイズとして

    あなたがセッションを使用しない場合は、一意の識別子としてのセッションIDを使用することができます。ただし、セッションIDは、Session_Start()イベントが構成されていない限り、セッションディクショナリに何かを格納するまで発行されません。

    ロードバランスまたはウェブガーデンシナリオでは、もう少し複雑になりますが、同じ基本アイデアを使用して、情報をメモリではなくデータベースに保存することができます。

  • 0

    ユーザーがログオンすると、スライディング有効期限(たとえば20分)でHttpContext.Current.Cacheにユーザー名を書き込みます。

    次に、Application_PreRequestHandlerExecute内のGlobal.asax.csで、現在のユーザーのキャッシュエントリを「タッチ」して、スライド有効期限をリセットします。

    ユーザーが明示的にログアウトすると、ユーザー名がHttpContext.Current.Cacheから削除されます。

    これを行うと、任意の時点でHttpContext.Current.Cache.Countによって現在のユーザー数が表示されます。

    注:これは、他の目的でキャッシュを使用していないことを前提としています。

    関連する問題