0

我正在用 ASP.NET 2.0 (C#) 开发 webapp。我有问题要解决问题。

应用程序应该显示在线用户,并且只有管理员应该显示用户名。我使用 Application[] 对象来存储用户名和计数,在 Globall.asax 文件中设置值。

在下面的代码中,我将显示与计数器相关的部分:

   protected void Application_Start(object sender, EventArgs e){
            Application["OnlineCounter"] = 0; 
    }
    protected void Session_Start(Object sender, EventArgs e){
            // Code that runs when a new session is started
            if (Application["OnlineCounter"] != null){
                Application.Lock();
                Application["OnlineCounter"] = ((int)Application["OnlineCounter"]) + 1;
                Application.UnLock();
            }
    }
    protected void Session_End(Object sender, EventArgs e){
            // Code that runs when a new session is started
            if (Application["OnlineCounter"] != null){
                Application.Lock();
                Application["OnlineCounter"] = ((int)Application["OnlineCounter"]) - 1;
                Application.UnLock();
            }
    }

在我的本地机器上使用此代码,我可以正确计算在线用户。相反,当我在服务器(Windows 2003 Server 和 IIS6)上发布此代码时,我发现了以下问题:使用 3 个不同的用户(使用不同的浏览器)从我的机器访问,我将在单个页面中只看到 1 个用户(在每个浏览器中我只看到 1 个在线用户)!

这有什么问题吗?任何建议表示赞赏。谢谢

4

2 回答 2

1

您可以使用性能计数器来获取该数字。

这里有ASP.NET 的性能计数器列表。在“ASP.NET 应用程序性能计数器”下查找“会话活动”的描述。

然后,您可以使用PerformanceCounter 类为您的应用程序获取该性能计数器的值。

问题是这需要特权:

要读取 Windows Vista、Windows XP Professional x64 Edition 或 Windows Server 2003 中的性能计数器,您必须是 Performance Monitor Users 组的成员或具有管理权限。

一种方法是模拟应用程序的一部分,由具有这些权限的用户运行。它可以是 .asmx 网络服务,也可以是显示所需信息的网络表单本身。您只能使用web.config 中的位置身份模拟来模拟该服务。设置具有所需权限的用户并模拟该用户。

于 2012-05-08T12:10:46.307 回答
0

服务器是否配置为每个应用程序池使用多个工作进程?

ASP.NET 状态管理建议:http: //msdn.microsoft.com/en-us/library/z1hkazw7.aspx

应用范围:应用状态的范围也可能是一个缺点。存储在应用程序状态中的变量仅对运行应用程序的特定进程是全局的,并且每个应用程序进程可以有不同的值。因此,您不能依赖应用程序状态来存储唯一值或更新 Web-garden 和 Web-farm 服务器配置中的全局计数器。

使用 IIS 6.0 配置 Web Gardens:https ://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/659f2e2c-a58b-4770-833b-df96cabe569e.mspx?mfr=true

于 2012-05-08T09:45:20.603 回答