有没有办法确定在 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(链接不再有效)
ASP.NET 性能计数器,如 State Server Sessions Active(活动用户会话的数量)应该可以帮助您。然后你可以从你的管理页面读取并显示性能计数器..
如果您使用.net Membership,您可以使用
Membership.GetNumberOfUsersOnline()
有关它的更多信息:http: //msdn.microsoft.com/en-us/library/system.web.security.membership.getnumberofusersonline.aspx
如果您想自己实现相同的机制,您可以定义为 CurrentUserManager 类并在此处实现单例模式。CurrentUserManager 类的这个单例对象在 AppDomain 中是唯一的。在此类中,您将创建一次它的自身实例,并且您将通过隐藏其构造函数来禁止其他人创建此类的新实例。每当请求到达此对象时,该单个实例都会给出响应。因此,如果您实现一个保存每个用户记录的列表(当用户进来时,您将他添加到列表中;当他出去时,您将他从列表中删除)。最后,如果您想要当前用户数,您可以只向这个单例对象询问列表数。
如果您使用 sql server 作为会话状态提供程序,您可以使用此代码来计算在线用户数:
SELECT Count(*) As Onlines FROM ASPStateTempSessions WHERE Expires>getutcdate()
我过去看到的方法是在 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 命名空间获取数据。它允许您获得“会话活跃”等等。它允许您从本地服务器和远程服务器获取。
这是如何在本地计算机上执行此操作的示例
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 计数器的完整列表
Google Analytics 附带一个 API,可以在您的 ASP.NET MVC 应用程序上实现。它具有实时功能,因此可以跟踪您网站上的当前用户数量并将其返回到您的应用程序。