我在使用C#的ASP.NET中遇到静态变量的问题。我在webform中声明变量。
public partial class Logueado_Movimientos : System.Web.UI.Page
{
static List<ExchangeItems> theList;
protected void Page_Load(object sender, EventArgs e)
{
if (IsPostback) return;
theList = GetListValues();
}
}
到目前为止,这么好。我们测试了网站,没有发现问题,部署了它......但是在生产环境中发生了一些奇怪的事情。这个网站每天都在使用,只有两次,情况已经发生。
ExchangeItems有一个ID属性,它为每个要交换的项目返回数据库中的id。页面加载时只调用一次GetListValues()方法。之后,用户可以通过单击GridView中的复选框选择要交换的项目,进行进一步的验证,然后有一个“打印并保存”按钮,使用iTextSharp打印到PDF并将状态发送回数据库。
在所有验证之后,该项目在生产中已更改两次。例如,项目180是正在交换的项目,但是当打印和保存文档时,结果是项目103是处理的项目。所有先前的验证都将ID设置为180.项目103甚至不在列表中。
现在,检查数据库(SQL Server),我们发现项目103在项目180后10分钟保存。我们使用GetDate()函数来存储日期和时间。此外,他们被两个不同的用户分配给不同的客户。
用户可能需要10分钟来处理请求,有时他们会与客户通话。这意味着user1正在使用项目180,而user2正在使用项目103,两者都使用相同的模块/ webform。由于变量是静态的,两个用户是否可能正在影响彼此的信息?我现在宣称它是“私人静态”,只是出于偏执,但还有什么我想念的吗?
注意:变量是静态的,因为如果没有声明,则回发会丢失它的值。它不在Session变量中,因为它仅用于该模块/ webform中,而不是其他地方。
答案 0 :(得分:6)
由于变量是静态的,两个用户是否可能正在影响彼此的信息?
是 - 静态变量在会话间共享。私有化不会改变这一点。一种选择可能是使用会话变量
Session["theList"] = GetListValues();
它不在Session变量中,因为它仅用于该模块/ webform,而不是其他地方。
所以?拥有整个应用程序未使用的会话数据没有任何问题。