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

时间:2012-01-04 10:07:13

标签: c# asp.net iis assemblies global-asax

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

应用程序有时会停止正常工作 - 它的行为就像初始化从未发生过,或者某些类型在启动期间被忽略。一旦应用程序进入此失败状态(我认为它在池被回收后发生),它将保持这种状态,直到重新启动:

  1. 手动更新Web.Config(添加一些空格)
  2. 在IIS管理器中手动重新启动应用程序
  3. 在IIS管理器中手动停止和启动应用程序池
  4. 自动池回收
  5. 我注意到1.总是有帮助,但2,3,4不确定地工作 - 至少就我所说的而言,因为问题的本质不是确定性的 - 应用程序仅在一些预定的回收之后崩溃。 从global.asax代码和加载程序集的访问角度来看,1和2,3,4有什么区别?

    哦,如果它改变了什么,应用程序作为子应用程序(IIS站点树中的子文件夹)运行。

1 个答案:

答案 0 :(得分:1)

我相信您的问题可以通过保存一些状态信息来解决,以便应用程序可以了解其启动是否成功。

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

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

  1. 跟踪初始化。
  2. 不要让应用程序以意外状态运行。
  3. 仔细检查代码中某处是否有某些非托管资源未被释放(可能是文件流,数据库连接......?)。
  4. 记录记录记录 ...
  5. 直接回答你的问题:

    1. 回收应用程序池。
      • HttpApplication(Global.asax)触发应用程序初始化事件(启动事件)
    2. 回收应用程序池。
      • HttpApplication(Global.asax)触发应用程序初始化事件(启动事件)
    3. 基本上,在您再次启动之前,停止所有传入请求的应用程序。基本上,一个硬应用程序池回收。
      • HttpApplication(Global.asax)触发应用程序初始化事件(启动事件)
    4. 回收应用程序池。
      • HttpApplication(Global.asax)触发应用程序初始化事件(启动事件)
    5. 基本上,任何这些行动都会产生相同的结果。

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