IIS池回收,池重启,应用程序重启,web.config更新 - 全局asax

IIS池回收,池重启,应用程序重启,web.config更新 - 全局asax

问题描述:

我有在IIS 7下运行的MVC3 web应用程序。在global.asax应用程序的初始化期间,扫描由BuildManager.GetReferencedAssemblies()返回的所有程序集,以及在这些程序集中的所有类型(Assembly.GetTypes())以执行初始化操作。IIS池回收,池重启,应用程序重启,web.config更新 - 全局asax

有时应用程序停止正常工作 - 它的行为就好像初始化从未发生过或某些类型在启动过程中被忽略。一旦应用程序进入该故障状态(我觉得池被回收后,它发生),它保持这样直到被重新启动:

  1. 手册更新程序Web.Config(加入一些空格)在IIS
  2. 手动重新启动应用程序经理
  3. 手动停止和启动应用程序池在IIS管理器
  4. 自动池回收

我注意到1.总是有帮助的,但2,3,4-工作indeterministically - 至少就我所能说的而言,因为问题的性质不是确定性的 - 应用程序只有在一些预定的回收之后才会崩溃。 从global.asax代码的角度来看,1和2,3,4之间有什么区别,并且访问加载的程序集?

哦,如果应用程序改变任何东西,应用程序将作为子应用程序(IIS站点树中的子文件夹)运行。

我相信你的问题可以通过保存一些状态信息来解决,这样应用程序可以知道它的启动是否成功。

每次应用程序检查时都有错误地初始化,应该重新初始化它或抛出异常并重新启动应用程序。

这真的很难给你一个解决方案,但总结你可以这样做:

  1. 轨道初始化。
  2. 不要让应用程序以意外状态运行。
  3. 仔细检查是否有一些非托管资源未在您的代码中被释放(可能是文件流,数据库连接...?)。
  4. 记录记录记录 ...

直接回答你的问题:

  1. 回收应用程序池。
    • HttpApplication(Global.asax)触发应用程序初始化事件(启动事件)
  2. 回收应用程序池。
    • HttpApplication(Global.asax)触发应用程序初始化事件(启动事件)
  3. 基本上,停止所有传入请求的应用程序,直到您再次启动。基本上,一个艰难的应用程序池回收。
    • HttpApplication(Global.asax)触发应用程序初始化事件(启动事件)
  4. 回收应用程序池。
    • HttpApplication(Global.asax)触发应用程序初始化事件(启动事件)

基本上,任何这些动作的产生相同的结果。

你试过做IIS复位 - iisreset /restart命令 -?这应该释放任何锁定的资源,并停止任何不需要的循环,线程或任何使应用程序崩溃的事情。

+0

“应重新初始化它或抛出异常并重新启动应用程序。”是否可以从应用程序中的代码强制启动(使用Application_Start())? – PanJanek 2012-01-04 12:45:08

+0

@PanJanek嗯,我说的是在某些实用程序类或类似的东西中实现Application_Start初始化,并在此HttpApplication事件中调用它,或者在需要重新初始化以从某个错误中恢复的任何地方调用它。无论如何,你可以强制你的代码中的应用程序池回收(检查这个其他问题:http://*.com/questions/1645733/programatically-recycle-pool-from-asp-net-application-in-same-pool) – 2012-01-04 13:04:37

+0

添加一些日志记录并检查初始化是否正确完成后,事实证明问题不是global.asax没有触发,而是在初始化代码中。无论如何,感谢彻底的答案! – PanJanek 2012-01-05 06:44:44