C# IIS池回收、池重启、应用重启、web.config更新-全局asax

C# IIS池回收、池重启、应用重启、web.config更新-全局asax,c#,asp.net,iis,assemblies,global-asax,C#,Asp.net,Iis,Assemblies,Global Asax,我有MVC3 web应用程序在IIS 7下运行。在global.asax中初始化期间,应用程序扫描BuildManager.GetReferencedAssemblys()返回的所有程序集,以及这些程序集中的所有类型(Assembly.GetTypes()),以便执行初始化操作 有时,应用程序会停止正常工作—它的行为就好像从未发生过初始化,或者在启动过程中忽略了某些类型。一旦应用程序进入此失败状态(我认为它发生在池回收之后),它将保持这种状态,直到通过以下方式重新启动: 手动更新Web.Conf

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

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

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


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

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


    无论何时应用程序检查是否存在未正确初始化的内容,都应该重新初始化它或引发异常并重新启动应用程序

    给你一个解决方案确实很难,但你可以做到:

  • 跟踪初始化
  • 不要让应用程序在意外状态下运行
  • 仔细检查代码中是否有未释放的非托管资源(可能是文件流、数据库连接…?)
  • 日志记录日志记录日志记录
  • 直接回答您的问题:

  • 回收应用程序池。
    • HttpApplication(Global.asax)触发应用程序初始化事件(启动事件)
  • 回收应用程序池。
    • HttpApplication(Global.asax)触发应用程序初始化事件(启动事件)
  • 基本上,停止所有传入请求的应用程序,直到您再次启动它。基本上,是一个硬应用程序池回收。
    • HttpApplication(Global.asax)触发应用程序初始化事件(启动事件)
  • 回收应用程序池。
    • HttpApplication(Global.asax)触发应用程序初始化事件(启动事件)
  • 基本上,任何这些动作都会产生相同的结果


    您是否尝试过执行IIS重置-
    iisreset/restart
    命令-?这将释放所有锁定的资源并停止任何不必要的循环、线程或任何使应用程序崩溃的东西。

    “应该重新初始化它或引发异常并重新启动应用程序。”是否可以从应用程序内部的代码强制启动(使用application_Start())?@PanJanek,我说的是让应用程序启动初始化在一些实用程序类或类似的东西中实现,并在这个HttpApplication事件中调用它,或者在任何需要重新初始化以从错误中恢复的地方调用它。无论如何,在添加一些日志记录并检查初始化是否正确完成后,您可以在代码中强制应用程序池回收(检查其他问题:),结果表明问题不是全局的。asax没有启动,而是在初始化代码中。无论如何,rhanks需要彻底的回答!