asp.net 4.0を使用してWebサイトを作成しましたが、Webサイトに接続しているオンラインユーザーを数える必要があります。JQueryでこれを行うにはどうすればよいですか?
3 に答える
代わりに Google アナリティクスを試してみませんか?無料で、コードを書く必要はありません。ブラウザ、画面の解像度、地域、あらゆる種類のものごとに内訳が表示されます。
基本的に、ajax 呼び出しと一意のセッション ID を使用して x 秒ごとにサーバーに ping を実行する「ハートビート」をページに作成する必要があります。サーバーでは、これらの ping/id をログに記録/カウントし、(最後の x 秒に基づいて) サイトにいつでも何人の人がいるかを概算できます。集計のたびにカウンターをリセットすることを忘れないでください。
ASP.NET を使用しているため、いくつかの異なるサーバー側オプションがあります。一部の人々は、クエリ文字列を介して渡されたパラメーターを読み取り、ajax を介して呼び出すスタンドアロンの .aspx ページを作成することを好みます。個人的には、Web ハンドラー(.ashx) を作成します。これは、このようなものに特に役立つからです。他の人は、「正しい」方法は、単純な ajax 呼び出しでページ webmethodsを呼び出すことだと言うでしょう。MVC を使用している場合は、さらに簡単です。いくつかのクエリ文字列パラメーターを読み取り、それに要求を送信するコントローラー メソッドをセットアップするだけです。最終的には、アプリに最適な方法を決定するのはあなた次第です。どの方法も同じことを行います。
私は個人的にハンドラー(.ashx)を作成しますが、それは私がそれらにとても慣れているからです。@ ajax81で概説されているハートビートコードを使用しますが、(同じ呼び出しで)アクティブユーザーの数を返します。
ページにアクセスする各ユーザーに一意のセッションIDを割り当てます。aspxページとセッション状態を使用している場合は、すでにこれをほぼ取得しています。session_startでは、セッション変数を作成して一意の識別子を割り当て(その場で作成されたGUIDを使用します)、Session["userguid"]と永続的なストレージに保存します。最も簡単な方法は、DB内の単純なテーブルです。
クライアントスクリプト(jquery ajax)は、foo.ashxにリクエストを送信します。それは本当に空のリクエストでさえありえます。jQueryのsetTimeOutタイプの関数を使用して、これをすべてのページで1分ごとに呼び出します。
ハンドラーでは、リクエストを取得し、それが誰からのものであるかを把握し、その特定のユーザーの「最終更新日」の日付を更新します(Session["userguid"]から取得します。
すべての「アクティブユーザー」テーブルを調べて、5分ほどで更新されていないテーブルを削除します。
「アクティブユーザー」の新しい数を取得し、それをクライアントページに返します。クライアントページは、選択した方法で番号を表示できます。
これはすべてテストされていませんが、理論は正しいはずです。私はあなたのためにあなたの完全なアプリを書く時間がありません。;)
void Session_Start(object sender, EventArgs e)
{
// Code that runs when a new session is started
Guid sessionId = Guid.NewGuid();
Session["sessionGuid"] = sessionId;
// Write code to store this in a table -- "INSERT INTO myTable (sessionGuid, dateCreated, dateUpdated) VALUES (@sessionGuid, getdate(), getdate()) ; "
}
あなたのページで:
$.ajax({
url: "foo.ashx",
context: document.body
}).done(function( data ) {
$(someobject).html(data);
});
foo.ashxのコード:
public void ProcessRequest(HttpContext context)
{
Guid sessionGuid = (Guid)context.Session["sessionGuid"];
// Write code to update table "UPDATE myTable SET dateUpdated = getdate() where sessionId = @sessionGuid ; "
// Write statement to delete all items older than x minutes "DELETE from myTable WHERE dateUpdated < dateadd(minute, -10, getdate()) ; "
// Get cound of existing real users: "SELECT count(*) FROM myTable ;"
// Return that value.
context.Response.ContentType = "text/plain";
context.Response.Write(YourValue);
}