C# 应用程序对象在传递服务器上丢失数据

C# 应用程序对象在传递服务器上丢失数据,c#,asp.net,web-applications,session-state,C#,Asp.net,Web Applications,Session State,我正在用ASP.NET2.0(C#)开发webapp。我有个问题要解决 应用程序应该在线显示用户,只有管理员才能显示用户名。我使用Application[]对象存储usermame和count,并在Globall.asax文件中设置值 在以下代码中,我将显示与计数器相关的部分: protected void Application_Start(object sender, EventArgs e){ Application["OnlineCounter"] = 0;

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

应用程序应该在线显示用户,只有管理员才能显示用户名。我使用Application[]对象存储usermame和count,并在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个在线用户)

这有什么问题吗?如有任何建议,我们将不胜感激。
Thanx是否将服务器配置为每个应用程序池使用多个工作进程

ASP.NET状态管理建议:

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


使用IIS 6.0配置Web Gardens:

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

这是你的名单。请在“ASP.NET应用程序性能计数器”下查找“活动会话”的说明

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

问题在于,这需要特权:

要在Windows Vista、Windows XP Professional x64 Edition或Windows Server 2003中读取性能计数器,您必须是性能监视器用户组的成员或具有管理权限


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

可能重复:谢谢Christoper,但我认为我的问题与会话事件无关。应用程序变量(Application[])已初始化,问题是每个会话似乎都不同。我在IIS上检查了“maximunnumnumber of worker processs”,并将其设置为4。我应该增加吗?不。如果工作进程的最大数量超过1,那么每个请求都可能由不同的进程处理,因此每个请求都会获得不同的应用程序对象实例—它在每个进程中存在一次,而不是在每个web应用程序中存在一次。因此,如果这是问题的原因,可以将数字减少到1,或者将计数器存储到其他地方,如数据库-但是您必须记住,会话可以在不执行会话结束事件的情况下结束,例如,当工作进程被终止时。我已尝试将工作进程减少到1。它仍然为每个浏览器显示一个用户。此更改后,是否重新启动IIS?我已回收应用程序池,但我没有重新启动IIS,因为我无法停止应用程序。