【问题标题】:Scope of static Variable in multi-user ASP.NET web application多用户 ASP.NET Web 应用程序中静态变量的范围
【发布时间】:2012-12-18 18:12:37
【问题描述】:

静态变量是否在用户会话中保留其值?

我有一个 ASP.NET Web 应用程序,其中有两个按钮。一个用于设置静态变量值,另一个用于显示静态变量值。

namespace WebApplication1
{   

public partial class WebForm1 : System.Web.UI.Page
{
    public static int customerID;

    protected void Page_Load(object sender, EventArgs e)
    {

    }

    protected void ButtonSetCustomerID_Click(object sender, EventArgs e)
    {
        customerID = Convert.ToInt32(TextBox1.Text);
    }

    protected void ButtonGetCustomerID_Click(object sender, EventArgs e)
    {
        Label1.Text = Convert.ToString(customerID);
    }
}

}

虽然这适用于单用户环境,但如果有 2 个用户同时从两台计算机登录会发生什么情况,用户 1 将值设置为 100,然后用户 2 将值设置为 200。在用户 1 调用 Get值按钮。他认为价值是什么?

【问题讨论】:

标签: c# asp.net static


【解决方案1】:

静态变量范围是应用程序级别。

如果您将某些内容存储在静态变量中,那么您肯定做错了什么。

如果一个用户保存数据(在静态变量中),同时另一个用户访问同一页面,那么他将获得相同的数据(保存第一个用户)。

So better you can store the values in **Sessions**.

【讨论】:

  • 可以将Session变量配置为使用内存吗?我有一种情况,api 使用者不存储或检索 cookie,我不希望数据库命中,它每秒发生多次。
  • 如果所有用户无论如何都需要查看完全相同的数据并且唯一的考虑是查看最新的数据并且用户不能自己更改数据,这是否重要?
【解决方案2】:

不要对属性使用静态然后它可以工作:

public int customerID
{
    get { return Session["customerID"] == null? -1 : (int)Session["customerID"]; }
    set { Session["customerID"] = value; }
}

【讨论】:

    【解决方案3】:

    静态变量是否在用户会话中保留其值?

    是的,这就是为什么在 Web 应用程序中使用静态变量时应该非常小心的原因。您将在并发问题中运行,因为为一个请求提供服务的多个线程可以修改变量的值。

    虽然这适用于单用户环境,但如果有 2 个用户同时从两台计算机登录,用户 1 设置 值为 100,然后用户 2 将值设置为 200。之后用户 1 调用获取值按钮。他认为价值是什么?

    用户之后会看到 200 个。

    【讨论】:

    • 静态变量的范围对多个用户存在相同的感谢
    【解决方案4】:

    这对你有用(记住,你需要处理空值/-1):

    public static int customerID
    {
        get { return session["customerID"] == null? -1 : (int)session["customerID"]; }
        set { session["customerID"] = value; }
    }
    

    【讨论】:

    • 您不能从静态 get 或 set 访问器直接访问会话变量作为“会话”。您需要改用 HttpContext.Current.Session。
    • 这很危险,并发用户可能会为其他用户返回 session["customerID"],同意吗?
    猜你喜欢
    • 1970-01-01
    • 2016-12-28
    • 1970-01-01
    • 2017-01-15
    • 1970-01-01
    • 2012-06-23
    • 1970-01-01
    • 1970-01-01
    • 2012-11-24
    相关资源
    最近更新 更多