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

Gle*_*eno 6 c# asp.net-mvc

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

有几种情况我可以合理地看到这种情况发生,例如未处理Exception导致重新初始化.但我很难复制这个,所以我想肯定.

seh*_*ehe 10

最常见的情况是:

  • 重新加载Web应用程序

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

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

app-domain将被重新加载(根据需要重新编译动态部分),这将使任何静态初始化的数据无效.

如果创建静态数据很昂贵,或者避免重新加载AppDomain,应用程序池或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实例正常运行
  • 建议

我建议你看看:)


SLa*_*aks 5

static 每个 AppDomain 类初始化一次。

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