如何确定ASP.NET站点(IIS)上的用户数?还有他们的信息?

时间:2020-03-06 14:57:15  来源:igfitidea点击:

有没有一种方法可以确定在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实例,并通过隐藏其构造函数来禁止其他人创建此类的新实例。每当有一个请求发送到该对象时,该单个实例都会给出响应。因此,如果实现一个保留每个用户记录的列表(当一个用户进来时,我们将其添加到列表中;当他离开时,将其从列表中删除)。最后,如果我们希望当前用户数,可以向该单例对象询问列表数。