c# - ASP.NET 静态变量的生命周期

标签 c# asp.net static

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

protected static int SomeGlobalUnsecureID;
protected static string SomeGlobalUnsecureString;

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

  1. 无论连接的用户如何,都保持相同数量的内存

  2. 当且仅当持久性信息与 '内存'(因为实际读取字符串是耗时的 我。

现在,由于我在 PageLoad 中进行了检查,所以我在重新加载页面时没有问题。然而,我的页面充满了 WebMethods,有时我看到静态变量已归零。奇怪的是;即使静态变量归零, session 仍然处于事件状态(所以->没有服务器或应用程序池重启等)

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

最佳答案

静态变量在应用程序域的生命周期内持续存在。因此,导致您的静态变量“重置”的两件事是应用程序域重启或使用新类。对于存储在 aspx Page 类中的静态变量,当 ASP.NET 决定将 aspx Page 重新编译为新类并用新页面类替换旧页面类时,您可能会丢失静态变量。

出于这些原因,如果系统决定重新启动或替换类 (.NET doesn't kill or unload classes/assemblies in a running app domain),那么您的静态变量将重置,因为您将通过重新启动或替换获得一个新类。这适用于 aspx 页面和 classes in the App_Code folder

如果出于任何原因认为需要重新编译某个类 (see ASP.NET dynamic compilation),ASP.NET 将替换该类。

您无法防止应用程序域重启导致静态变量丢失,但您可以尝试通过类替换避免它。您可以将静态变量放在一个不是 aspx 页面且不在 App_Code 目录中的类中。您可能希望将它们放在程序中某处的 static class 上。

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

静态变量是每个池的,这意味着如果您有 2 个运行您的 asp.net 站点的池,则您有 2 个不同的静态变量。 ( Web garden mode )

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

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

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

由于无论如何重启应用程序都会重置您的静态数据,如果您真的想保留数据,则应使用自定义类将数据存储在数据库中。您可以将每个用户的信息存储在 Session State 中用database session state mode . ASP.NET 应用程序状态/变量对您没有帮助,因为 they are stored in memory, not the database ,因此它们也会在应用程序域重启时丢失。

关于c# - ASP.NET 静态变量的生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8919095/

相关文章:

.net - .Net 上有 URL 验证器吗?

c# - 静态对象为空/未在正确时间初始化

java - 通过实例引用访问静态成员的最佳解决方案

c# - 正则表达式用多个单词中的相同值替换字符串

c# - 使用 Func 和依赖注入(inject)的 Autofac 动态调用

c# - 当在创建客户表单中添加客户时,如何更新 MainForm 中的 Datagridview?

asp.net - jQuery UI 确认对话框和 asp.net 回发

c# - System.InvalidCastException 解析 FluentCommandLineParser 参数

asp.net - Linq 和 EF4,内连接条件语句

c++ - 函数定义中可以缺少函数声明中的静态关键字吗?