Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 跨应用程序实例泄漏?_Asp.net - Fatal编程技术网

Asp.net 跨应用程序实例泄漏?

Asp.net 跨应用程序实例泄漏?,asp.net,Asp.net,我有一个ASP.net web应用程序在默认应用程序池中运行。用户报告返回的结果是针对其他用户的。据我所知,两台不同机器上的两个用户不可能看到对方的结果 下面是内部结构的大致情况 namespace SomeApplication { public partial class _Default : System.Web.UI.Page { static ArrayList results = new ArrayList(); protected void Button_Cli

我有一个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:表中


现在我知道results对象在全局范围内,但据我所知,这是应用程序对象的每个实例

静态变量不是特定于用户的,它们是当前运行的ASP.NET工作进程中的全局变量。这一过程完全有可能服务于您的两个用户。这意味着进程中运行的任何代码都将看到此静态变量。静态也是危险的,因为IIS可以在它喜欢的任何时候回收工作进程,这将在变量中存储值

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


正如Adam已经指出的,静态变量不是特定于用户的,而是每个
AppDomain
。因此,在ASP.NET场景中,您在一个应用程序池中运行多个站点,每个应用程序池进程(根据配置,每个应用程序池可以有多个工作进程)将为每个web应用程序提供一个应用程序域。因此,所有用户都将共享相同的静态变量

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

对于您已经定位的示例,最好使用一个实例变量,该变量对应于每个请求范围(在ASP.NET场景中),但完全满足大多数用例(并且您不必担心线程安全性)。对于要在重复回发过程中为同一页面维护的数据,视图状态是一种方法。对于有更多生命周期的数据,您可以在两者之间进行选择,等等。前两种是线程安全的实现,而应用程序状态提供了在访问它们之前锁定插槽的方法

有关ASP.NET中提供的各种状态管理选项,请参考以下链接: