18

有没有办法确定在 ASP.NET 应用程序中具有活动会话的用户数?我在特定应用程序中有一个管理/工具页面,我想显示有关所有打开会话的信息,例如会话数,也许还有请求机器的地址,或每个用户的其他凭据信息。

4

8 回答 8

17

在 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(链接不再有效)

于 2009-03-18T20:03:11.420 回答
11

ASP.NET 性能计数器,如 State Server Sessions Active(活动用户会话的数量)应该可以帮助您。然后你可以从你的管理页面读取并显示性能计数器..

于 2008-09-30T23:50:04.113 回答
4

如果您使用.net Membership,您可以使用

Membership.GetNumberOfUsersOnline()

有关它的更多信息:http: //msdn.microsoft.com/en-us/library/system.web.security.membership.getnumberofusersonline.aspx

于 2009-03-18T20:13:45.717 回答
2

如果您想自己实现相同的机制,您可以定义为 CurrentUserManager 类并在此处实现单例模式。CurrentUserManager 类的这个单例对象在 AppDomain 中是唯一的。在此类中,您将创建一次它的自身实例,并且您将通过隐藏其构造函数来禁止其他人创建此类的新实例。每当请求到达此对象时,该单个实例都会给出响应。因此,如果您实现一个保存每个用户记录的列表(当用户进来时,您将他添加到列表中;当他出去时,您将他从列表中删除)。最后,如果您想要当前用户数,您可以只向这个单例对象询问列表数。

于 2009-05-29T08:48:01.377 回答
2

如果您使用 sql server 作为会话状态提供程序,您可以使用此代码来计算在线用户数:

SELECT Count(*) As Onlines FROM ASPStateTempSessions WHERE Expires>getutcdate()
于 2018-06-25T04:33:56.980 回答
1

我过去看到的方法是在 Global.asax 文件中的 Session_OnStart 事件中添加额外的代码,以与会话无关的方式存储信息,例如数据库或 HttpApplicationState 对象。根据您的需要,您还可以使用 Session_OnEnd 删除此信息。

您可能希望使用 Application_Start 和 Application_End 事件来初始化和清理其中的一些信息。

然后管理页面可以读取此信息并显示统计信息等。

这在http://msdn.microsoft.com/en-us/library/ms178594.aspxhttp://msdn.microsoft.com/en-us/library/ms178581.aspx有更深入的解释。

于 2008-09-30T23:44:40.990 回答
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());
}

ASP.NET 的性能计数器提供了可以监视的 ASP.NET 计数器的完整列表

于 2013-09-23T13:24:20.927 回答
0

Google Analytics 附带一个 API,可以在您的 ASP.NET MVC 应用程序上实现。它具有实时功能,因此可以跟踪您网站上的当前用户数量并将其返回到您的应用程序。

这里有一些信息

于 2017-05-08T11:30:01.760 回答