【问题标题】:ASP.NET C# Static Variables are global?ASP.NET C# 静态变量是全局的吗?
【发布时间】:2009-10-13 21:59:43
【问题描述】:

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

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

// 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' 变量实例。

幸运的是,这一切都发生在开发/暂存数据库而不是实时数据库上。我不确定是否只需要删除“静态”关键字来阻止每个人设置/读取变量。

有什么想法吗?谢谢

【问题讨论】:

    标签: c# asp.net static variables


    【解决方案1】:

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

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

    Session["_groupID"] = Convert.ToInt16(Request.QueryString["GroupID"]);
    

    您可以通过以下方式检索它:

    short groupID = Convert.ToInt16(Session["_groupID"]);
    

    【讨论】:

    • 感谢 Adam .... 唯一的是,我真的不需要存储它以供其他页面使用,我只想存储 'Request.QueryString["GroupID “]” 变成一个变量,我可以在该页面中的任何位置使用它...而不被“其他”用户的页面实例更改...“private _groupId”(省略静态关键字)是否允许这样做?如果没有,那么我想我可以使用 Sessions。感谢您的意见!
    • Dal - 正如您所怀疑的那样,无论在整个客户端浏览器会话中查看的页面如何,都会保留会话变量(除非您手动将它们过期)。您可以使用 ViewState 来存储该值,但是它会流式传输到客户端(使用其默认设置),因此它有可能被弄乱(但不太可能)。 ViewState 将保留每页的值。您是否有理由不能继续使用最初使用的 QueryString 值?对于您的情况,我建议使用 QueryString、ViewState、HiddenField 或 Session 进行存储。
    • 感谢您的快速回复。应用程序已修改为直接使用查询字符串,而不是将其推送到变量中,所以是的,我想我将继续使用此方法(查询字符串)。我只是好奇我的原始实现在没有 static 关键字的情况下是否仍然有效。非常感谢! :)
    • Dal,如果您只是将其用作每个请求的 groupID 的临时存储,您可以删除 static 关键字。这将使该字段成为页面实例的成员。如果您想加载 groupID 的值并将其跨回发存储到同一页面,您可以使用其他选项。不管怎样,祝你好运!
    【解决方案2】:

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

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

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

    如果您想存储用户特定的设置,请使用 Session 变量。

    【讨论】:

      【解决方案3】:

      静态变量与创建它们的应用程序域具有相同的生命周期。因此,如果您得到一些错误的值,则可能是应用程序逻辑或其他方面存在问题。您应该将 SessionState 用于每个用户的数据。

      【讨论】:

        【解决方案4】:

        您可能需要一些时间来熟悉一下静态关键字在 C# 中的作用。在此处阅读:static in different languagesMSDN here

        【讨论】:

          猜你喜欢
          • 2015-06-12
          • 2012-12-30
          • 1970-01-01
          • 2015-10-04
          • 1970-01-01
          • 2011-04-27
          • 2011-05-13
          • 1970-01-01
          • 2018-12-22
          相关资源
          最近更新 更多