ASP.NET静态variables的生命周期

我在页面类(而不是Global.asax)中定义的静态variables中保存一些信息。 我只在代码中声明variables,如:

protected static int SomeGlobalUnsecureID; protected static string SomeGlobalUnsecureString; 

并在PageLoad事件中定义variables。 例如,我从数据库中检查ID,如果它与SomeGlobalUnsecureID不同,我从其他地方更新SomeGlobalUnsecureID和String,否则保持原样。 这在我的应用程序中是完全安全的。 逻辑(即那些数据不安全,每个人都可以访问它们,没问题); 只有我想完成的事情是

  1. 保持相同的内存量,不pipe用户连接

  2. 改变当且仅当持久性信息与“内存”中的信息不同时(因为实际上读取string对我来说是耗时的。

现在,由于我在PageLoad中进行检查,所以在重新加载页面时没有问题。 但是,我的页面充满了WebMethods,有时我看到静态variables归零。 而奇怪的部分是; 即使静态variables被清零(所以 – >服务器或应用程序池重启等),会话仍然是活动的。

这对我来说真的很奇怪 我假设静态variables将保持其值,直到应用程序(以某种方式)结束。 但即使Session没有过期,静态variables也被清零。 你有什么build议? 使用应用程序variables是更好的select吗? 我在网上阅读的所有文档都build议使用静态variables而不是应用程序variables,是否需要声明它们不同?

静态variables在应用程序域的生命周期中保持不变。 所以会导致你的静态variables“重置”的两件事是一个应用程序域重新启动或使用一个新的类。 在你的情况下,静态variables存储在aspx Page类中,当ASP.NET决定重新编译aspx Page到新的类中时,你可能会失去静态variables,用新的类replace旧的页面类。

由于这些原因,如果系统决定重新启动或replace类( .NET不会终止或卸载正在运行的应用程序域中的类/程序集,那么您的静态variables将重置,因为您正在重新启动或更换新的类。适用于App_Code文件夹中的 aspx页面和类

如果ASP.NET由于某种原因认为需要重新编译它,将会replace一个类( 请参阅ASP.NETdynamic编译 。

您无法防止应用程序域重新启动时丢失静态variables,但您可以尝试避免从类replace。 你可以把你的静态variables放在一个不是aspx页面的类中,而不在App_Code目录下。 您可能希望将它们放在程序中的某个static class

 public static class GlobalVariables { public static int SomeGlobalUnsecureID; public static string SomeGlobalUnsecureString; } 

静态variables是每个池,这意味着如果你有2个池,运行你的asp.net站点,你有2个不同的静态variables。 ( Web花园模式 )

如果系统以这种方式之一重新启动您的asp.net应用程序,静态variables会丢失。

  1. 池决定需要重新编译。
  2. 您打开app_offline.htm文件
  3. 您手动重新启动池
  4. 池达到一些限制,你已经定义并重新启动。
  5. 出于任何原因你重新启动iis或池。

这个静态variables不是线程安全的,如果你从不同的线程访问它们,你需要使用lock关键字。

由于应用程序重新启动会重置静态,无论如何,如果您确实想要保存数据,则应使用自定义类将数据存储在数据库中。 您可以使用数据库会话状态模式将每个用户的信息存储在会话状态中 。 ASP.NET应用程序状态/variables将不会帮助您,因为它们存储在内存中,而不是数据库 ,所以它们在应用程序域重新启动时也会丢失。

我认为以下两点对于静态variables的生命周期也很重要:

1 – 在应用程序池的高级设置中,选中“回收” – >“常规时间间隔(分钟)”设置。 它的默认值是1740,这意味着在每29个小时内,由于应用程序池的回收,您的静态variables会丢失。 此设置用于终止可能的内存泄漏。 我不会改变这个设定

2 – 在应用程序池的高级设置中,选中“Process Model” – >“Idle Time-out(minutes)”设置。 它的默认值是20,这意味着在应用程序池中每20分钟不活动,工作进程将被终止/挂起,这将导致您的静态variables丢失。 此设置用于在应用程序池未使用一段时间时释放资源。 您可以将其设置为0以禁用超时。

静态variables用于存储所有对象的相同值

 protected void Page_Load(object sender, EventArgs e) { sss s1, s2; s1 = new sss(); s1.TotalMark = 10; s2 = new sss(); s2.TotalMark = 20; sss.SchoolName = "St.Joseph's Hr.Sec.S"; //We can access through class and assign common to all s1.PrintData(); s2.PrintData(); } public class sss { public static string SchoolName { set; get; } public int TotalMark { set; get; } public string StudentName{set;get;} public void PrintData() { Console.WriteLine(TotalMark); Console.WriteLine(SchoolName); Console.WriteLine(StudentName); } }