Windows Server缓存Web APIs(MVC/MVC Core)需求及内存加载问题咨询
解决Windows Server 2016上MVC/MVC Core Web API闲置后首次请求慢的缓存优化方案
嘿,这个问题我太熟了——Windows Server上的Web API闲置一段时间就“休眠”,首次请求慢得让人抓狂,本质就是进程被回收了,得重新加载到内存里。结合MVC和MVC Core的不同特性,给你几个实用的解决办法:
1. 调整IIS应用程序池的闲置超时(最直接的方案)
Windows IIS的应用程序池默认20分钟闲置就会回收进程,你遇到的25分钟刚好超过这个阈值,所以每次闲置后都要重新初始化。调整这个设置就能解决根本问题:
- 打开IIS管理器,找到你的API对应的应用程序池
- 右键选「高级设置」
- 在「进程模型」下找到「闲置超时(分钟)」,改成更大的值(比如设为
0表示永不超时,或者根据业务需求设成几小时) - 顺便可以调整「回收」下的「固定时间间隔(分钟)」,默认1740分钟(29小时),如果不需要定期回收也可以设为
0
2. 给ASP.NET Core API加后台保活服务
如果不想修改IIS全局设置,或者需要更灵活的控制,可以给MVC Core API加个后台定时请求的服务,让进程一直保持活跃:
步骤1:创建后台保活服务类
public class KeepAliveService : IHostedService, IDisposable { private readonly IHttpClientFactory _httpClientFactory; private Timer _timer; // 替换成你的API健康检查接口(建议做一个轻量的/health接口,只返回200 OK) private readonly string _healthCheckUrl = "http://localhost/your-api/health"; public KeepAliveService(IHttpClientFactory httpClientFactory) { _httpClientFactory = httpClientFactory; } public Task StartAsync(CancellationToken cancellationToken) { // 启动立即执行一次,之后每隔18分钟请求一次(比默认闲置超时短) _timer = new Timer(SendKeepAliveRequest, null, TimeSpan.Zero, TimeSpan.FromMinutes(18)); return Task.CompletedTask; } private void SendKeepAliveRequest(object state) { var client = _httpClientFactory.CreateClient(); try { var response = client.GetAsync(_healthCheckUrl).Result; response.EnsureSuccessStatusCode(); } catch (Exception ex) { // 这里可以加日志记录,比如_logger.LogError(ex, "保活请求失败"); } } public Task StopAsync(CancellationToken cancellationToken) { _timer?.Change(Timeout.Infinite, 0); return Task.CompletedTask; } public void Dispose() { _timer?.Dispose(); } }
步骤2:在Program.cs中注册服务
builder.Services.AddHostedService<KeepAliveService>(); builder.Services.AddHttpClient(); // 必须注册HttpClientFactory
3. 启用IIS输出缓存(适合静态/稳定响应的API)
如果你的API有一些返回内容不经常变化的接口(比如公共数据接口),可以用IIS的输出缓存直接缓存响应结果,既减轻后端压力又加快响应:
- 打开IIS管理器,找到你的API站点,打开「输出缓存」
- 点击「添加」创建缓存规则:
- 指定路径(比如
/api/public/*) - 设置缓存持续时间(比如30分钟)
- 根据需求选择是否忽略查询字符串、HTTP头等
- 指定路径(比如
注意:动态内容(比如用户专属数据)别用这个方案,否则会返回错误的缓存数据!
4. 调整.NET运行时的GC和内存设置
针对不同的.NET框架,优化内存和垃圾回收策略,让进程更稳定:
传统MVC(.NET Framework)
在web.config中添加/修改以下配置:
<system.web> <!-- 调整应用程序池并发设置 --> <applicationPool maxConcurrentRequestsPerCPU="5000" maxConcurrentThreadsPerCPU="0" requestQueueLimit="5000" /> </system.web> <runtime> <!-- 启用服务器GC,更适合多CPU的服务器环境 --> <gcServer enabled="true"/> <gcConcurrent enabled="true"/> </runtime>
ASP.NET Core
在Program.cs中添加服务器GC设置:
// 启用服务器GC AppContext.SetSwitch("System.GC.Server", true);
一些额外注意事项
- 如果设置了应用程序池永不超时,建议定期手动重启进程(比如每周一次),避免内存泄漏累积
- 后台保活的请求频率一定要比应用程序池闲置超时短,不然还是会被回收
- 要是用了负载均衡,得确保每个节点都配置了保活机制,或者让负载均衡器定期发送健康检查请求
内容的提问来源于stack exchange,提问作者A J
相关产品推荐
相关产品推荐

