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



我有在IIS 7下运行的MVC3 web应用程序。在global.asax中初始化期间,应用程序扫描BuildManager.GetReferencedAssemblies()返回的所有程序集,以及这些程序集中的所有类型(Assembly.GetTypes()),以便执行初始化操作。

应用程序不时地停止正常工作——它的行为就好像初始化从未发生过,或者在启动过程中省略了某些类型。一旦应用程序进入这种失败状态(我认为这发生在池被回收之后),它就会一直保持这种状态,直到重新启动

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

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

哦,如果应用程序更改了任何内容,它将作为子应用程序(IIS站点树中的子文件夹)运行。

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

每当应用程序检查有什么东西初始化不正确时,它应该重新初始化它,或者抛出异常并重新启动应用程序。

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

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

直接回答您的问题:

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

基本上,这些操作中的任何一个都会产生相同的结果。

您是否尝试过执行IIS重置-iisreset /restart命令-?这应该会释放任何锁定的资源,并停止任何不需要的循环、线程或任何破坏应用程序的事情。

最新更新