有没有办法确定ASP.NET应用程序中有活动会话的用户数?我在特定应用程序中有一个管理员/工具页面,我想显示有关所有打开会话的信息,例如会话数,可能还有请求计算机的地址,或每个用户的其他凭据信息。
答案 0 :(得分:17)
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方法用于防止多个线程同时更改此变量。
验证SessionState是否为“InProc”以使其正常工作
<system.web>
<sessionState mode="InProc" cookieless="false" timeout="20" />
</system.web>
Visitors online: <%= Application["OnlineUsers"].ToString() %>
注意:代码最初是从 http://www.aspdotnetfaq.com/Faq/How-to-show-number-of-online-users-visitors-for-ASP-NET-website.aspx 复制的(链接不再有效)
答案 1 :(得分:11)
ASP.NET Performance Counters与State Server Sessions Active(活动用户会话数)一样可以帮助您。然后,您可以从管理页面read and display the performance counters {...}}
答案 2 :(得分:4)
如果您使用.net会员资格,则可以使用
Membership.GetNumberOfUsersOnline()
有关它的更多信息:http://msdn.microsoft.com/en-us/library/system.web.security.membership.getnumberofusersonline.aspx
答案 3 :(得分:2)
如果您想自己实现相同的机制,可以像CurrentUserManager类一样定义并在此处实现单例模式。类CurrentUserManager的这个单例对象在AppDomain中是唯一的。在这个类中,您将创建一次自我实例,并且您将通过隐藏其构造函数来禁止其他人创建此类的新实例。每当请求到达此对象时,该单个实例将给出响应。因此,如果您实现一个列表来保存每个用户的记录(当用户进入时,您将他添加到列表中;当他出去时,您将他从列表中删除)。最后,如果你想要当前用户数,你可以只询问列表计数到这个单例对象。
答案 4 :(得分: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更深入地解释了这一点。
答案 5 :(得分:1)
如果您使用sql server作为会话状态提供程序,则可以使用以下代码计算在线用户数:
SELECT Count(*) As Onlines FROM ASPStateTempSessions WHERE Expires>getutcdate()
答案 6 :(得分:0)
您可以使用PerformanceCounter从System.Diagnostics命名空间中获取数据。它允许您获得“会话活动”等等。它允许您从本地服务器以及远程服务器获取。
以下是如何在本地计算机上执行此操作的示例
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());
}
Performance Counters for ASP.NET提供了可以监控的ASP.NET计数器的完整列表