【问题标题】:IIS pool recycle, pool restart, app restart, web.config update - global asaxIIS 池回收、池重启、应用程序重启、web.config 更新 - 全局 asax
【发布时间】:2012-01-04 10:07:13
【问题描述】:

我有在 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 站点树中的子文件夹)运行。

【问题讨论】:

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


    【解决方案1】:

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

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

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

    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 命令 -?这应该会释放所有锁定的资源并停止任何不需要的循环、线程或任何使您的应用程序崩溃的东西。

    【讨论】:

    • “应该重新初始化它或抛出异常并重新启动应用程序。”是否可以从应用程序内部的代码强制启动(使用 Application_Start())?
    • @PanJanek 好吧,我说的是在某些实用程序类或类似的东西中实现 Application_Start 初始化,并在此 HttpApplication 事件或您需要重新初始化以从某些错误中恢复的任何地方调用它.无论如何,您可以在您的代码中强制应用程序池回收(检查其他问答:stackoverflow.com/questions/1645733/…
    • 在添加一些日志并检查初始化是否正确完成后,结果发现问题不在于 global.asax 没有触发,而是在初始化代码中。无论如何,感谢彻底的回答!
    猜你喜欢
    • 1970-01-01
    • 2010-09-19
    • 2023-04-01
    • 1970-01-01
    • 2011-05-05
    • 2014-10-16
    • 2012-03-28
    • 2010-09-28
    • 2016-02-02
    相关资源
    最近更新 更多