跨应用程序实例泄漏?

时间:2011-08-17 09:31:45

标签: asp.net

我在默认应用程序池中运行了一个ASP.net Web应用程序。用户已报告返回的结果是针对不同用户的。据我所知,两台不同机器上的两个用户无法看到对方的结果。

这里的内部结构非常粗略

namespace SomeApplication
{
 public partial class _Default : System.Web.UI.Page
 {
   static ArrayList results = new ArrayList();

    protected void Button_Click(object sender, EventArgs e)
    {
        // Add data to results 
        // Display in asp:Table element 
     }
  }
}

User1和User2大致在同一时刻使用上述应用程序。 User1得到了正常的结果,但是user2混合了他们的结果,User1的结果出现在asp:Table中。

现在我知道结果对象在全局范围内,但我的理解是这是一个应用程序对象的每个实例。

2 个答案:

答案 0 :(得分:2)

静态变量不是特定于用户的,它们在当前运行的ASP.NET辅助进程中是全局的。这一过程完全有可能为您的用户提供服务。这意味着在进程中运行的任何代码都将看到此静态变量。静态也很危险,因为IIS可以随时回收工作进程,这会将变量中的值加起来。

相反,您可能需要使用ASP.NET中提供的状态/缓存机制之一,如会话状态:

http://msdn.microsoft.com/en-us/library/ms972429.aspx

答案 1 :(得分:1)

正如亚当已经指出的那样,静态变量不是用户特定的,而是每AppDomain个。因此,在一个应用程序池中运行多个站点的ASP.NET场景中,每个应用程序池进程(每个应用程序池可以有多个基于配置的工作进程)将为每个Web应用程序创建一个应用程序域。因此,所有用户将共享相同的静态变量。

不仅内置静态变量没有线程安全性,当两个不同的线程访问这些变量时,您实际上可以看到不一致的数据。

对于您已经选址的示例,最好使用与每个请求范围相对应的实例变量(在ASP.NET方案中),但是完全填充大多数用例(并且您不必担心关于线程安全)。对于您希望在重复回发后为同一页面维护的数据,视图状态是可行的方法。对于具有更长使用寿命的数据,您可以选择Session StateASP.NET CacheApplication state等。前两个是线程安全实现,而应用程序状态提供在访问前锁定插槽的方法

请参阅这些链接,了解ASP.NET中提供的各种状态管理选项: