如何禁用IIS向ASPNET Core 1.1发送的应用终止功能?
如何禁用IIS发送的ASP.NET Core应用关闭信号
你观察得非常准确!那个POST /iisintegration请求确实是IIS的ASP.NET Core模块(ANCM)发送的应用关闭指令,目的是在应用池闲置或回收时终止.NET Core进程。要禁用这个自动关闭行为,你可以从以下几个层面入手:
1. 调整IIS应用池的核心设置
这是最根本的解决方式,从IIS层面阻止应用池触发回收或闲置终止:
- 打开IIS管理器,定位到你的应用所属的应用池
- 右键选择「高级设置」
- 找到「闲置超时(分钟)」,将其设置为
0(代表永不因闲置而关闭) - 同时检查「定期回收」下的「固定时间间隔(分钟)」,同样设为
0,避免应用池定时自动回收
2. 配置ANCM的进程闲置超时
在应用的web.config文件中,修改aspNetCore节点,添加processIdleTimeout属性并设置为永不超时:
<aspNetCore processPath="dotnet" arguments=".\YourApp.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" processIdleTimeout="00:00:00" />
这个设置会告诉ANCM,不要因为进程闲置而发送关闭信号,和IIS应用池的闲置超时设置配合使用效果最佳。
3. 自定义中间件拦截关闭请求(备选方案)
如果上面的配置仍无法解决问题,你可以通过自定义中间件直接拦截POST /iisintegration请求,阻止它触发应用关闭逻辑。在Startup.cs的Configure方法中,添加这段中间件(要放在app.UseIISIntegration();之前):
using Microsoft.AspNetCore.Http; using System.Threading.Tasks; // 在Configure方法中 app.Use(async (context, next) => { if (context.Request.Method == HttpMethods.Post && context.Request.Path.Equals("/iisintegration")) { // 返回202状态码,但不执行应用关闭逻辑 context.Response.StatusCode = StatusCodes.Status202Accepted; return; } await next(); }); // 原有的UseIISIntegration等中间件 app.UseIISIntegration(); // ...其他中间件配置
⚠️ 注意:这种方式属于“拦截式”的临时解决方案,不推荐作为首选方案,因为可能会忽略IIS的合法回收信号,导致应用池回收时进程无法正常退出。
额外建议
你的应用基于ASP.NET Core 1.1,这个版本已经停止维护很久了。如果条件允许,建议升级到.NET Core 3.1或更高的LTS版本,后续版本的ANCM在进程存活管理、性能稳定性上都有大幅优化,能减少这类问题的发生。
内容的提问来源于stack exchange,提问作者ubi
相关产品推荐
相关产品推荐

