.NET 公共静态变量的“寿命”?
Posted
技术标签:
【中文标题】.NET 公共静态变量的“寿命”?【英文标题】:"lifespan" of .NET public static variables? 【发布时间】:2011-07-12 19:29:36 【问题描述】:我做了一个小实验。在来自 Login.aspx 按钮的 LoginButton_Click() 事件中,我有一个代码执行如下操作:
MyClass.MyPublicStaticString = LoginNameTextBox.Text;
登录后通过 FormsAuthentication 转到 Default.aspx。在 Default.aspx 上,我在 Page_Load() 上有这样的代码:
Label1.Text = MyClass.MyPublicStaticString.ToString();
等待几分钟后,即使在我的登录超时到期之前,Label1.Text 也会变为空。
这里发生了什么?
【问题讨论】:
这并不能回答您的问题,但如果您使用的是表单身份验证并且需要用户名,为什么不直接从User.Identity.Name
中提取它?
(1) 您是否在其他任何地方设置了该值? (2) 小心显示用户名的公共静态字符串字段。它不是线程安全的,所以有人可能会得到错误的用户名。
【参考方案1】:
我从未使用过 ASP.NET,但我可以告诉你静态变量不会过期,或者类似的东西。
我最好的是,这与另一个请求以某种方式重置变量有关,或者甚至可能重新启动整个应用程序,创建一个全新的内存空间,显然没有以前的静态值。
【讨论】:
【参考方案2】:我认为您的应用程序的 Page 类不再在您的网络服务器的内存中,这就是您的静态变量消失但您的身份验证 cookie 仍然有效的原因,因为您的 asp.net 表单身份验证超时可能尚未过期。
【讨论】:
【参考方案3】:静态字段是(除非[ThreadStatic]
)每个应用程序域一个实例,这意味着:所有请求共享相同值。在 Web 应用程序中使用 static
时需要特别小心。如果有疑问:不要。
重新生命周期;应用程序域;它们在分配给静态字段时不会被收集,如果应用程序池在 IIS 中回收,它们将过期。
【讨论】:
【参考方案4】:是否可以使用 ASP.NET Application State 对象代替,因为在 ASP.NET 中这也将跨多个回发/会话保持状态?
【讨论】:
【参考方案5】:你真的应该使用 Session State 来处理这种事情。
如果您不这样做,那么在短时间内登录的两个用户都将获得最后一个用户的姓名,因为它最后存储在 MyPublicStaticString
。
【讨论】:
【参考方案6】:可以使用应用程序状态对象。但是,它保存的信息将在应用程序运行期间持续存在。另一方面,会话状态具有与当前用户的访问相关的生命周期,以及此后 20 分钟的默认值,以验证他/她不只是临时吃零食和使用慢速网络。此外,ApplicationState 对所有用户上下文都是可见/可访问的;而 Session 仅在当前用户的上下文中可见和可访问。另一方面,回发在上下文中仅限于从服务器发送的最后一个页面的上下文,因为当浏览器将页面返回到服务器时会发生回发,包括用户操作的结果。 Page 的生命周期与 Session 的生命周期和 ApplicationState 的生命周期不同,不应混淆,任何一个都可以。
【讨论】:
以上是关于.NET 公共静态变量的“寿命”?的主要内容,如果未能解决你的问题,请参考以下文章