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

Posted

技术标签:

【中文标题】如何确定 ASP.NET 站点 (IIS) 上的用户数?他们的信息呢?【英文标题】:How can I determine the number of users on an ASP.NET site (IIS)? And their info? 【发布时间】:2010-09-14 09:52:12 【问题描述】:

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

【问题讨论】:

【参考方案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 对此进行了更深入的解释。

【讨论】:

这个答案和我标记为接受的答案一样好。我只能标记1。我喜欢使用 Session_OnStart 和 Session_OnEnd 在数据库中跟踪会话的想法,它允许我存储每个会话的特定信息。谢谢。【参考方案2】:

ASP.NET Performance Counters 像 State Server Sessions Active(活动用户会话的数量)应该可以帮助您。然后你可以从你的管理页面read and display the performance counters..

【讨论】:

不清楚你会怎么做,或者是否只能计算当前的应用程序。你有一些代码要分享吗?【参考方案3】:

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

【讨论】:

这一切都很好,但它不会在使用 sql 作为状态服务器的网络农场托管的大型网站上工作:( 在这种情况下会话开始和结束不会触发。可以做些什么来解决这个问题? 【参考方案4】:

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

Membership.GetNumberOfUsersOnline()

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

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

您可以使用 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 计数器的完整列表

【讨论】:

【参考方案7】:

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

Here's some information

【讨论】:

【参考方案8】:

如果你使用 sql server 作为会话状态提供者,你可以使用这段代码来统计在线用户数:

SELECT Count(*) As Onlines FROM ASPStateTempSessions WHERE Expires>getutcdate()

【讨论】:

以上是关于如何确定 ASP.NET 站点 (IIS) 上的用户数?他们的信息呢?的主要内容,如果未能解决你的问题,请参考以下文章

先定一个小目标Asp.net Core 在IIS上的托管运行

ASP.NET - IIS 7 - DotNetNuke - 如何强制浏览器重新加载站点的 CSS?

IIS 将 ASP.NET 5 BETA 8 站点部署到 IIS 会出现 HTTP 错误 500.19 - 内部服务器错误

诊断 IIS 7 和 ASP.NET MVC 上的 404 错误

如何在经典模式下保护 IIS7 上的静态内容?

如何使用 ASP.NET Core RC2 MVC6 和 IIS7 获取当前 Windows 用户