4

オンライン ユーザーをカウントし、それを常にホームページに表示する必要がある Web サイトを作成します。すぐに使えるモジュールを適用することに興味はありません。これが私がすでに行ったことです:

プロジェクトに Global.asax ファイルを追加する

Global.asax ファイルに次のコード スニペットを記述します。

void Application_Start(object sender, EventArgs e) 
{
    Application["OnlineUsers"] = 0;
}

void Session_Start(object sender, EventArgs e) 
{
    Application.Lock();
    Application["OnlineUsers"] = (int)Application["OnlineUsers"] + 1;
    Application.UnLock();
}

void Session_End(object sender, EventArgs e) 
{
    Application.Lock();
    Application["OnlineUsers"] = (int)Application["OnlineUsers"] - 1;
    Application.UnLock();
}

実際には正常に動作しますが、次のバグが見つかりました: --> ユーザーがブラウザーを閉じても、セッション タイムアウトがまだ生きているため、実際のオンライン ユーザー数は表示されません!

セッションのタイムアウト間隔を変更する以外に解決策はありますか?

4

4 に答える 4

3

onUserExit jQuery プラグインを使用して、サーバー側のコードを呼び出してセッションを破棄できます。ドキュメントの準備ができたら onUserExit を有効にします。

<script type="text/javascript">
  jQuery(document).ready(function () {

    jQuery().onUserExit({
      execute: function () {
        jQuery.ajax({
          url: '/EndSession.ashx', async: false
        });
      },
      internalURLs: 'www.yourdomain.com|yourdomain.com'
    });
  });
</script>

EndSession.ashx でセッションを破棄し、サーバー側の Session_End が呼び出されます。

public void ProcessRequest(HttpContext context)
{
  context.Session.Abandon();
  context.Response.ContentType = "text/plain";
  context.Response.Write("My session abandoned !");
}

これはすべてのケースをカバーするわけではないことに注意してください (たとえば、ユーザーがタスク マネージャーでブラウザーを強制終了した場合など)。

于 2012-05-07T12:19:50.270 に答える
3

Session_End イベントは、サーバー側のセッションがタイムアウトしたときに発生します。これは、最後のリクエストが処理されてから 20 分後 (デフォルト) です。サーバーは、ユーザーがいつ「移動」または「ブラウザーを閉じる」かを認識しないため、それに対応することはできません。

于 2012-05-07T11:39:58.573 に答える
0

セッションが実際に終了しない限り、サーバーがユーザーがログインしていると見なすのは、このアプローチの制限です。これは、セッションタイムアウト構成で指定された分数が経過した場合にのみ発生します。

この投稿を確認してください:http://forums.asp.net/t/1283350.aspx

このOnline-active-users-counter-in-ASP-NETが見つかりました

于 2012-05-07T11:44:59.730 に答える
0

いいえ、セッションがタイムアウトするまで更新に時間がかかります...

于 2012-05-07T11:38:29.493 に答える