You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:53:05