如何确定ASP.NET站点(IIS)上的用户数?还有他们的信息?
有没有一种方法可以确定在ASP.NET应用程序中具有活动会话的用户数量?我在特定应用程序中有一个admin / tools页面,我想显示有关所有打开的会话的信息,例如会话数,也许是请求机器的地址或者每个用户的其他凭证信息。
解决方案
我过去看过的方法是在Global.asax文件中的Session_OnStart事件中添加额外的代码,以与会话无关的方式存储信息,例如数据库或者HttpApplicationState对象。根据需要,我们还可以使用Session_OnEnd删除此信息。
我们可能需要使用Application_Start和Application_End事件来初始化和清除某些信息。
然后,管理页面可以读取此信息并显示统计信息等。
在http://msdn.microsoft.com/zh-cn/library/ms178594.aspx和http://msdn.microsoft.com/zh-cn/library/ms178581.aspx中对此有更深入的解释。
诸如活动状态服务器会话(活动用户会话数)之类的ASP.NET性能计数器应该可以。然后,我们可以从管理页面中读取并显示性能计数器。
在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复制的(链接不再有效)
如果我们使用的是.net会员资格,则可以使用
Membership.GetNumberOfUsersOnline()
有关它的更多信息:http://msdn.microsoft.com/zh-cn/library/system.web.security.membership.getnumberofusersonline.aspx
如果我们想自己实现相同的机制,则可以像CurrentUserManager类一样定义并在此处实现单例模式。类CurrentUserManager的单例对象在AppDomain中将是唯一的。在此类中,我们将创建一次其self实例,并通过隐藏其构造函数来禁止其他人创建此类的新实例。每当有一个请求发送到该对象时,该单个实例都会给出响应。因此,如果实现一个保留每个用户记录的列表(当一个用户进来时,我们将其添加到列表中;当他离开时,将其从列表中删除)。最后,如果我们希望当前用户数,可以向该单例对象询问列表数。