ASP.NET アプリケーションでアクティブなセッションを持つユーザーの数を確認する方法はありますか? 特定のアプリケーションに管理/ツール ページがあり、開いているすべてのセッションに関する情報 (セッション数、要求しているマシンのアドレス、または各ユーザーのその他の資格情報など) を表示したいと考えています。
8 に答える
global.aspx 内
void Application_Start(object sender, EventArgs e)
{
// Code that runs on application startup
Application["OnlineUsers"] = 0;
}
void Session_Start(object sender, EventArgs e)
{
// Code that runs when a new session is started
Application.Lock();
Application["OnlineUsers"] = (int)Application["OnlineUsers"] + 1;
Application.UnLock();
}
void Session_End(object sender, EventArgs e)
{
// Code that runs when a session ends.
// Note: The Session_End event is raised only when the sessionstate
// mode is set to InProc in the Web.config file.
// If session mode is set to StateServer or SQLServer,
// the event is not raised.
Application.Lock();
Application["OnlineUsers"] = (int)Application["OnlineUsers"] - 1;
Application.UnLock();
}
注: Application.Lock および Application.Unlock メソッドは、複数のスレッドがこの変数を同時に変更するのを防ぐために使用されます。
Web.config 内
これが機能するには、SessionState が「InProc」であることを確認します
<system.web>
<sessionState mode="InProc" cookieless="false" timeout="20" />
</system.web>
.aspx ファイル内
Visitors online: <%= Application["OnlineUsers"].ToString() %>
注:コードは元々http://www.aspdotnetfaq.com/Faq/How-to-show-number-of-online-users-visitors-for-ASP-NET-website.aspxからコピーされたものです(リンクはアクティブではなくなりました)
State Server Sessions Active (アクティブなユーザー セッションの数) のようなASP.NET パフォーマンス カウンターが役立ちます。次に、管理ページからパフォーマンス カウンターを読み取って表示するだけです。
.netメンバーシップを使用している場合は、使用できます
Membership.GetNumberOfUsersOnline()
詳細: http://msdn.microsoft.com/en-us/library/system.web.security.membership.getnumberofusersonline.aspx
同じメカニズムを自分で実装したい場合は、CurrentUserManager クラスのように定義し、ここでシングルトン パターンを実装できます。クラス CurrentUserManager のこのシングルトン オブジェクトは、AppDomain 内で一意です。このクラスでは、その自己インスタンスを 1 回作成し、コンストラクターを非表示にして、他のユーザーがこのクラスの新しいインスタンスを作成できないようにします。このオブジェクトにリクエストが来るたびに、その単一のインスタンスがレスポンスを返します。したがって、すべてのユーザーの記録を保持するリストを実装するとします (ユーザーが入ってきたらリストに追加し、出て行ったらリストから削除します)。最後に、現在のユーザー数が必要な場合は、このシングルトン オブジェクトにリスト数を問い合わせるだけです。
過去に見た方法では、Global.asax ファイルの Session_OnStart イベントにコードを追加して、データベースや HttpApplicationState オブジェクトなど、セッションに依存しない方法で情報を保存します。必要に応じて、Session_OnEnd を使用してこの情報を削除することもできます。
Application_Start および Application_End イベントを使用して、この情報の一部を初期化およびクリーンアップすることができます。
管理ページは、この情報を読み取り、統計などを表示できます。
これについては、 http ://msdn.microsoft.com/en-us/library/ms178594.aspxおよびhttp://msdn.microsoft.com/en-us/library/ms178581.aspxで詳しく説明されています。
PerformanceCounter を使用して、System.Diagnostics 名前空間からデータを取得できます。「Sessions Active」などを取得できます。リモートだけでなくローカルサーバーからも取得できます。
ローカル マシンで実行する方法の例を次に示します。
void Main()
{
var pc = new PerformanceCounter("ASP.NET Applications", "Sessions Active", "__Total__");
Console.WriteLine(pc.NextValue());
}
またはリモートサーバーの場合は次のようにします。
void Main()
{
var pc = new PerformanceCounter("ASP.NET Applications", "Sessions Active", "__Total__", "ServerHostName.domain");
Console.WriteLine(pc.NextValue());
}
ASP.NET のパフォーマンス カウンターは、監視できる ASP.NET カウンターの完全なリストを提供します。