Asp中的静态类..NET MVC应用

本文关键字:MVC 应用 NET 静态类 Asp | 更新日期: 2023-09-27 18:11:29

我想知道如果一个静态类在一个ASP。. NET MVC应用程序可以初始化多次。我最初设计我的应用程序,使静态组件将从数据库中获取一些东西,并作为缓存,我添加了一个刷新方法,从构造函数调用类。刷新方法也可以通过应用程序的管理部分使用。在某些时候,我注意到数据更新不需要手动触发,这意味着静态构造函数运行不止一次。

在一些情况下,我可以合理地看到这种情况发生,例如未处理的Exception导致重新初始化。但是我在复制这个时遇到了麻烦,所以我想确定一下。

Asp中的静态类..NET MVC应用

最常见的情况是:

  • 重新加载web应用程序

    • 感动. config
    • 感动二进制文件
    • 异常终止(内存不足,权限错误)
  • 重新加载应用程序池

  • 重启IIS
  • 重新启动w3wp.exe(至少29小时一次!)

应用程序域将被重新加载(必要时重新编译动态部分),这将使任何静态初始化的数据无效。

如果创建静态数据很昂贵,你可以通过将静态数据持久化在某个地方来解决这个问题,或者避免重新加载AppDomain、Application Pool或IIS服务器。

更新: Phil Haack刚刚在这里发表了一篇相关的博客文章:http://haacked.com/archive/2011/10/16/the-dangers-of-implementing-recurring-background-tasks-in-asp-net.aspx

  • Bye Bye App Domain
    • 在解释上述内容方面做得更好。值得注意的是,IIS至少每29小时就会回收它的工作进程,而共享主机会更频繁地回收AppDomain(可能在20分钟的空闲时间内)。
  • 所以告诉ASP。NET,"嘿,我在这里工作!"
    • 概述了你可以应用的技术来获得AppDomain关闭的通知- 可以使用它来让你的Singleton实例行为"正确"
  • 推荐

我建议你读一下

static类每个AppDomain初始化一次。

如果IIS回收你的AppDomain,一切都会重新初始化。