2011-08-17 30 views
1

我有一个运行在默认应用程序池中的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 
    } 
    } 
} 

用户1和用户使用上述应用在大致同一时刻都在内部结构的外观。 User1得到了正常的结果,但是user2得到了他们的结果,而User1的结果出现在asp:表中。

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

回答

2

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

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

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

1

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

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

对于您所选择的示例,您最好使用与每个请求范围(在ASP.NET场景中)相对应的实例变量,但是全部填充大部分用例(并且您不必担心线程安全)。对于想要通过反复回发来维护同一页面的数据,视图状态是最好的选择。对于寿命更长的数据,您可以在Session State,0 ASP.NET Cache,Application state等之间进行选择。前两种是线程安全实现,而应用程序状态提供了在访问插槽之前锁定插槽的方法。

参考这些链接,您在ASP.NET有各种可用的状态管理选项: