【发布时间】:2015-04-16 16:29:42
【问题描述】:
我在使用 C# 的 ASP.NET 中遇到了一个静态变量问题。我在网络表单中声明变量。
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 中使用,没有其他地方。
【问题讨论】:
-
你不能那样做。您需要 session 或 ViewState。
-
基本上你没有对多个用户进行测试。使用 Session 而不是静态的,即使这也不是最好的解决方案
-
@phil652,谢谢,也期待为您提供帮助。
-
就目前而言,我相信这个问题已经被围绕“C# use static in ASP.Net questions/articles”的多个现有问题所涵盖。如果您发现我选择的重复项不能涵盖您的全部/部分问题,请确保要么更新问题,所以很明显它已经足够不同了(确保在链接中编辑当前副本),或者询问有关缺失部分的新问题。
-
@AlexeiLevenkov。在我发布问题之前没有遇到您提供的答案。也许应该看得更远,但我不能花太多时间浏览它。由于它已经在生产中,因此需要快速回答。
标签: c# asp.net static webforms