【问题标题】:ASP.NET Core 3.1 application does not terminate process after Program.Main finishes runningProgram.Main 完成运行后,ASP.NET Core 3.1 应用程序不会终止进程
【发布时间】:2020-11-17 11:47:43
【问题描述】:

我有一个相当大的 ASP.NET Core 应用程序在 IIS 应用程序池中运行,并具有重叠回收。我已经设置了IHostApplicationLifetime 处理程序,我看到它正在触及所有生命周期方法以及我设置的AppDomain.CurrentDomain.ProcessExit 处理程序。当我要求回收时,会发生以下情况:

  1. ApplicationStopping被击中
  2. ApplicationStopped被击中
  3. Startup 中配置的依赖被释放
  4. Program.cswebHost.Run()后的断点被命中(这是程序Main方法的最后一行)
  5. ProcessExit 处理程序正在运行

此时我预计w3wp 已经死了。但是不,它会在一段时间后徘徊,并继续占用大量内存。我也可以在 Process Explorer 中查看它,我发现它仍然有一些活动。

我想明显要寻找的东西是需要处理的东西,但我不知道如何寻找这些东西。我怎样才能弄清楚为什么w3wp 不会消失这么长时间/是什么让它一直存在?

【问题讨论】:

    标签: asp.net asp.net-core iis


    【解决方案1】:

    据我所知,点击 ProcessExit 处理程序意味着 asp.net 核心应用程序已关闭,而不是 w3wp.exe。

    w3wp.exe 由 IIS 而非网站管理。 IIS 将检查 w3wp.exe 是否免费(处理请求)。如果大约 20 分钟后没有请求(默认)。然后 IIS 将停止 w3wp.exe。

    IIS 控制台管理器包含空闲超时值。如果您想尽快关闭 w3wp.exe。我建议您可以将值减小到 1,这意味着如果 1 分钟内没有请求,它将停止 w3wp.exe。

    更多设置方法,请参考以下步骤:

    1. 打开 IIS 管理控制台,找到应用程序池

    2.点击高级设置,修改空闲超时

    【讨论】:

      最近更新 更多