如何确定 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 - 内部服务器错误