5

ASP.NETサイトで、特定の時点でサイトにログインしているユーザーの数を追跡するために使用できるいくつかの手法は何ですか?

たとえば、次のようなレポートを作成できます。

        10:00am  11:00am  12:00pm  1:00pm  2:00pm ....
 3/25      25      32       45      40      37
 3/26      31      38       50      57      40
 3/27      28      37       46      35      20
 etc. 

編集:いいえ、ASP.NETメンバーシッププロバイダーは使用していません。ユーザーが「ログイン」ステータスにあるかどうかを判断するために、自家製/ハッキーセッションベースの方法を使用しています。

4

9 に答える 9

8

Webサイトはユーザーをログインさせますか?含まれている場合は、ユーザーが新しいページをリクエストするたびにユーザーテーブルの「最終訪問」フィールドを更新できます。その後、1時間ごとに、「最終訪問」のタイムスタンプが最後のすべてのユーザーを取得するSQLクエリを実行します。 15分程度(現在サイトにいると想定)。

ユーザーがログインしていない場合は、ユーザー名ではなくIPアドレスを使用して簡単にログインできます。ただし、この方法では、プロキシの問題が発生する可能性があります(つまり、同じ企業ネットワークの複数のユーザーがすべて単一のIPアドレスから来ている可能性があるため、合計で1人のユーザーとしてのみカウントされます)。

于 2009-03-26T14:24:48.553 に答える
3

この種はあなたのサイトに依存します。ASP.Netメンバーシッププロバイダーを使用している場合は、Membership.GetNumberOfUsersOnline()ログインしているユーザーの数を確認できる方法があります。パフォーマンスカウンターもあると思います。ログインしたユーザーの概念は、xが構成可能である過去x分以内に何かをしたユーザーです。

アクティビティの量を把握したい場合は、パフォーマンスカウンターを使用して着信リクエストを追跡することもできます。

編集

SQL ASPメンバーシッププロバイダーがDBのフィールドにアクティビティ日付を記録することにより、これを実装していることをご存知でしょう。x分以内にすべてのアクティビティをクエリするだけです。

2分ごとにサーバーにアクセスするクライアント側のポーリング機能を追加したので、ユーザーがページに座っている間、アクティビティがなくてもそこにいることがわかります。これにより、ユーザーをシステムから強制的に除外し、他のシステムメッセージを配信する方法を提供することもできます。ちょっといいね。

于 2009-03-26T14:23:37.747 に答える
2

セッション ストレージに SQL Server を使用している場合 (つまり、web.config でモードが "SQLServer" の場合) 、global.asax<sessionState>に依存するソリューションを使用することはできません。メソッドが呼び出されることはないためです。Session_End

ただし、SQL エージェントDeleteExpiredSessionsジョブを正しく実行していると仮定すると (SQL State がインストールされたときにデフォルトで実行されるはずです)、Session Db に対して次の SQL を実行するだけで済みます。

SELECT COUNT(SessionId) FROM ASPStateTempSessions
于 2010-05-27T13:59:48.670 に答える
1

私が過去に使用したのは、主に Session_Start と Session_End を中心とした Global.asax 関数で、Start でカウントを増やし、最後はセッション タイムアウトのために少しトリッキーだったと思います。カウントの正確性にあまり関心がない場合は、ここで終了できます。

そうでない場合は、おそらく javascript onUnload イベントとある種の ajax リクエストを組み合わせて使用​​し、セッションを無効にしてユーザーを差し引くでしょう。イベントは、ユーザーが実際にページを離れたのか、サイトの別のページに移動したのかを確認する必要があります。

とにかく、そこから始めましょう。私は ASP サイトと関係があることを覚えているので、この方法に関する情報は間違いなく出回っています。

于 2009-03-26T15:20:10.827 に答える
0

最初にセッションタイムアウトを1分間に設定します。

次のJavaScriptコードだけで、HTMLコンテンツを含まない単純なheartbeat.aspxページを作成します。

<html>
  <head>
  <script language="javascript">
  function reloadPage()
  {
    window.navigate("heartbeat.aspx");
  }
  </script>
  </head>
<body onload="window. setTimeout(‘reloadPage()’, 30000)">
</body>
</html>

これにより、30秒ごとに自分自身が再要求され、セッションが存続します。

heatbeat.aspxページを非表示のフレームに配置します。

ユーザー数を取得するには、Global.asaxのSession_StartイベントとSession_Endイベントの静的カウンターを使用してセッション数を取得するだけです。

于 2009-03-26T18:15:18.533 に答える
0

InProcセッション状態を使用している場合は、global.asaxで次のように実行できます。

Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
    Application("ActiveSessionCount") = 0
End Sub

Sub Session_Start(ByVal sender As Object, ByVal e As EventArgs)
    Application("ActiveSessionCount") += 1
End Sub

Sub Session_End(ByVal sender As Object, ByVal e As EventArgs)
    Application("ActiveSessionCount") -= 1
End Sub

Webフォームの値にアクセスするのも同じくらい簡単です

Dim Count as Integer = Application("ActiveSessionCount")
于 2009-03-26T18:22:18.827 に答える
0
public class ActiveUsers
{
    private static List<LastUserActivity> users;
    private static object syncroot = new object();
    private static DateTime lastPruned;

    public static int SessionLength = 20;

    static ActiveUsers()
    {
        users = new List<LastUserActivity>();
        lastPruned = DateTime.UtcNow;
    }

    public void RecordUserActivity(int userId)
    {
        lock (syncroot)
        {
            var user = users.FirstOrDefault(x => x.UserId == userId);
            if (user == null)
            {
                user = new LastUserActivity() { UserId = userId };
                users.Add(user);
            }
            user.UtcTime = DateTime.UtcNow;

            if (lastPruned.AddMinutes(5) < DateTime.UtcNow)
            {
                Prune();
                lastPruned = DateTime.UtcNow;
            }
        }
    }

    private static void Prune()
    {
        users.RemoveAll(x => x.UtcTime.AddMinutes(SessionLength) < DateTime.UtcNow);
    }

    public int GetActiveUsers()
    {
        return users.Count;
    }
}
public class LastUserActivity
{
    public int UserId { get; set; }
    public DateTime UtcTime { get; set; }
}

(BeginRequest、AcquireRequestState など)ActiveUsersのメソッドに呼び出しを追加します。global.asax

于 2016-11-26T19:41:58.230 に答える