ASP.NET C#静态变量是全局的吗?

Dal*_*Dal 20 c# asp.net variables static

今天我发布了一个小的asp.net beta网络应用程序,允许内部员工修改一些产品信息.我们开始遇到用户覆盖彼此产品信息的问题......即使每个工作人员正在编辑一个完全不同的行(产品).

经过一些谷歌搜索,我想我知道发生了什么,它与静态变量的使用有关,下面是一个快速粗略的问题示例:

// 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
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,根据我的研究,一个静态变量实际上存在于整个应用程序中,这意味着如果多个用户正在使用该应用程序,他们将有效地读取"_groupId"的相同"值",并且在某些情况下实际设置它导致页面的另一个用户"实例"将数据保存到错误的行(ProductGroupId).

我的意图是静态变量与其他用户隔离,并且不应该是 - 每个用户都有自己的页面实例,因此他们自己的'_groupId'变量实例.

幸运的是,这一切都发生在dev/staging数据库而不是live db上.我不确定是否只需要删除'static'关键字来停止每个人设置/读取的变量.

有什么想法吗?谢谢

Ada*_*itz 22

是的,在ASP.NET中,静态字段生命周期适用于应用程序域(请注意,这对于泛型类型而言略有不同).

我建议使用服务器会话来存储要与客户端浏览器会话实例关联的数据(用户登录).即

Session["_groupID"] = Convert.ToInt16(Request.QueryString["GroupID"]);
Run Code Online (Sandbox Code Playgroud)

你可以通过这样做来检索它:

short groupID = Convert.ToInt16(Session["_groupID"]);
Run Code Online (Sandbox Code Playgroud)


Jar*_*Par 18

说应用程序范围内存在静态变量是不正确的.它们实际上存在于两个不同的层面

  1. 对于非泛型类型,每个AppDomain都有一个静态变量
  2. 对于泛型类型,每个AppDomain每个通用实例化都有一个

应用程序可以包含许多AppDomain,并且在多种类型的应用程序中都是如此.

如果要存储用户特定设置,请使用Session变量.