3

在 .net Web 应用程序中,.aspx 页面和页面背后的 c# 代码有什么特别之处,它们会改变静态变量的行为。

我有大量在其他地方开发的应用程序页面,并且通过它们运行一个通用模式,我认为应该将实例变量声明为静态变量。

这个问题的更详细的陈述是:如果我有两个 Web 会话 a 和 b 在同一个应用程序池中的同一个 iis 服务器上运行,如果 a 访问有问题的页面并将静态变量 x 设置为 value1,然后 b 访问同一页面并将静态变量 x 设置为值 2,我的理解是 value1 已被值 2 替换。我的困境是这种模式在代码中重复使用,在较高级别上代码似乎可以工作。结论是,要么是运气(在会话 a 中的时间在会话 b 命中之前放弃了对变量的需求),要么是其他原因。

无论这是 ac# 细微差别还是开发人员错误,我都愿意接受建议。

4

1 回答 1

3

静态属性/字段在 Web 应用程序中很好,只要它们用于共享数据,这些数据可以在任何时候可接受地消失,例如当应用程序池回收时。

也就是说,它们的值确实在 ASP.Net 应用程序内部共享,除非它们具有隔离的支持机制,例如Session.

例子

public static int UserId = 10; // BAD! everyone gets/sets this field's value

// BAD! everyone gets/sets this property's implicit backing value
public static int UserId {
     get;
     set;
}

// This case is fine; just a shortcut to avoid instantiating an object.
// The backing value is segregated by other means, in this case, Session.
public static int UserId{
    get{
        return (int)HttpContext.Current.Session["UserId"];
    }
}

// While I would question doing work inside a property getter, the fact that 
// it is  static won't cause an issue; every call retrieves data from a 
// database, not from a single memory location.
public static int UserId{
    get{
        // return some value from database
    }
}

在流量很大之前,您可能看不到问题。假设页面检索到一个值,将其放入静态变量中,使用一次,然后完成执行。如果页面执行速度很快,则只有非常小的(但很危险!)重叠窗口,除非时机正确和/或流量足够高,否则您可能看不到。

这可能会导致难以诊断的错误,因为它们取决于时间,并且您在本地机器上自行测试时可能不会看到它们。

于 2012-07-31T11:01:57.317 回答