今天我发布了一个小型的asp.net beta网络应用程序,允许内部员工修改一些产品信息。我们开始遇到用户覆盖彼此产品信息的问题......即使每个工作人员正在编辑一个完全不同的行(产品)。
在google上进行一些搜索之后,我想我知道发生了什么,它与使用静态变量有关,下面是一个快速粗略的问题示例:
// EditProductGroup.aspx.cs
public partial class EditProductGroup : System.Web.UI.Page
{
private static int _groupId = 0;
protected void Page_Load(object sender, EventArgs e)
{
_groupId = Convert.ToInt16(Request.QueryString["GroupID"]);
// get existing ProductGroup information from database using
//_groupId to find the row and populate textboxes
}
private void saveProductGroupData()
{
// when user hits 'save changes' button, update row
//where the primary key column 'ProductGroupID' matches _groupId in the table
}
}
因此,根据我的研究,一个静态变量实际上存在于整个应用程序中,这意味着如果多个用户正在使用该应用程序,他们将有效地读取'_groupId'的相同'值',并且实际上将其设置为不同的值会导致页面的另一个用户“实例”将数据保存到错误的行(ProductGroupId)。
我的意图是静态变量与其他用户隔离,并且不应该是 - 每个用户都有自己的页面实例,因此他们自己的'_groupId'变量实例。
幸运的是,这一切都发生在dev / staging数据库而不是live db上。我不确定是否只需要删除'static'关键字来停止每个人设置/读取变量。
有什么想法?感谢
答案 0 :(得分:22)
是的,在ASP.NET中,静态字段的生命周期适用于应用程序域(请注意,这对于泛型类型而言略有不同)。
我建议使用服务器会话来存储要与客户端浏览器会话实例关联的数据(用户登录)。 即
Session["_groupID"] = Convert.ToInt16(Request.QueryString["GroupID"]);
您可以通过执行以下操作来检索它:
short groupID = Convert.ToInt16(Session["_groupID"]);
答案 1 :(得分:18)
说应用程序范围内存在静态变量是不正确的。它们实际上存在于两个不同的层面
应用程序可以包含许多AppDomain,并且在多种类型的应用程序中都是如此。
如果您想存储用户特定的设置,请使用Session变量。
答案 2 :(得分:2)
静态变量与它们创建的应用程序域具有相同的生命周期。因此,如果您得到一些错误的值,则可能是应用程序逻辑中的某些问题。您应该为每个用户数据使用SessionState。
答案 3 :(得分:2)
您可能需要花一些时间来熟悉静态关键字在C#中负责的内容。请在此处阅读:static in different languages和MSDN here。