我在页面类(而不是Global.asax)中定义的静态变量中保存一些信息。我只在代码中声明变量,例如:
protected static int SomeGlobalUnsecureID; protected static string SomeGlobalUnsecureString;
并在PageLoad事件中定义变量。例如,我从数据库中检查ID,如果它与SomeGlobalUnsecureID不同,则从其他位置更新SomeGlobalUnsecureID和String,否则保持不变。这在我的应用程序中绝对安全。逻辑(即那些数据不安全,每个人都可以访问它们,没问题);我唯一想完成的是
无论连接的用户如何,都保持相同的内存量
仅当持久性信息与“内存”中的信息不同时才进行更改(因为实际读取字符串对我来说很耗时。
现在,由于我在PageLoad中进行了检查,所以重新加载的页面没有问题。但是,我的页面到处都是WebMethods,有时我看到静态变量为零。而奇怪的是:即使静态变量为零,会话仍处于活动状态(因此->没有服务器或应用程序池重启等)
这对我来说真的很奇怪。我假设静态变量将保持其值,直到应用程序(以某种方式)结束。但是,即使会话未过期,静态变量也将清零。你有什么建议?使用应用程序变量是更好的选择吗?我在网上阅读的所有文档都建议使用静态变量而不是应用程序变量,是否需要以某种方式声明它们?
静态变量在应用程序域的生命周期内一直存在。因此,导致您的静态变量“重置”的两件事是应用程序域重启或使用新类。对于将静态变量存储在aspx Page类中的情况,当ASP.NET决定将aspx Page重新编译为新类时,可能会丢失静态变量,用新的类替换旧的页面类。
出于这些原因,如果系统决定重新启动或替换该类(.NET不会杀死正在运行的应用程序域中的类/程序集),则您的静态变量将重置,因为您将通过重新启动或替换获得一个新的类。这适用于aspx页面和App_Code文件夹中的类
如果出于任何原因认为需要重新编译该类,则ASP.NET将替换该类(请参见ASP.NET动态编译)。
您无法防止由于应用程序域重启而丢失静态变量,但是您可以尝试避免在类替换中使用它。您可以将静态变量放在不是aspx页面且不在App_Code目录中的类中。您可能希望将它们放置static class在程序中的某个位置。
static class
public static class GlobalVariables { public static int SomeGlobalUnsecureID; public static string SomeGlobalUnsecureString; }
静态变量是每个池的,这意味着如果您有2个运行asp.net站点的池,则您将有2个不同的静态变量。(网络花园模式)
如果系统使用这种方式之一重新启动asp.net应用程序,则静态变量将丢失。
此静态变量不是线程安全的,如果您从其他线程访问它们,则需要使用 特殊的lock 关键字。
由于应用程序重启无论如何都将重置您的静态信息,因此,如果您确实要保留数据,则应使用自定义类将数据存储在数据库中。您可以存储每个用户的信息会话状态与数据库会话状态模式。ASP.NET应用程序状态/变量将无法为您提供帮助,因为它们存储在内存中,而不是数据库中,因此它们也会在应用程序域重启时丢失。