我做了一些实验。在 Login.aspx 按钮的 LoginButton_Click()事件中,我的代码类似于:
MyClass.MyPublicStaticString = LoginNameTextBox.Text;
登录后,FormsAuthentication将转到 Default.aspx 。在Default.aspx上,我在 Page_Load()上有一个代码,如下所示:
Label1.Text = MyClass.MyPublicStaticString.ToString();
等待几分钟后,Label1Text在我的登录超时到期之前变为空,即使 。
这里发生了什么?
答案 0 :(得分:15)
静态字段(除非[ThreadStatic]
)每个应用域一个实例,这意味着:所有请求共享相同的值。您需要在Web应用程序中使用static
特别小心。如果有疑问:不要。
重生; AppDomain;分配给静态字段时不会收集它们,如果App-Pool在IIS中循环使用,它们将会过期。
答案 1 :(得分:3)
可以使用Application State对象。但是,只要应用程序正在运行,它就会保留持续存在的信息。另一方面,会话状态的生命周期与当前用户的访问相关,此后默认为20分钟,以验证他/她不仅仅是暂时吃零食而且使用慢速网络。此外,ApplicationState对所有用户上下文都是可见/可访问的;会话仅在当前用户的上下文中可见且可访问。第三方面,回发在上下文中受限于从服务器发送的最后一页的上下文,因为当浏览器将页面返回到服务器(包括用户操作的结果)时发生回发。 Page的生命周期与Session的生命周期和ApplicationState的生命周期不同,不应混淆任何其他任何一个。
答案 2 :(得分:2)
我从未使用过ASP.NET,但我可以告诉你,静态变量不会过期,或类似的东西。
我最好的是,这与另一个以某种方式重置变量的请求有关,甚至可能重新启动整个应用程序,创建一个全新的内存空间,显然没有以前的静态值。
答案 3 :(得分:1)
你应该真的使用Session State来做这件事
如果不这样做,两个用户在短时间内登录将同时获得最后一个用户的姓名,因为它最后存储在MyPublicStaticString
中。
答案 4 :(得分:0)
我认为你的应用程序的Page类在你的网络服务器的内存中不再是你的静态变量消失的原因,但是你的身份验证cookie仍然有效,因为你的asp.net表单身份验证超时可能还没有过期。
答案 5 :(得分:0)
是否可以使用ASP.NET Application State对象,就像在ASP.NET中一样,这也可以在多个回发/会话中保持状态?