ASP.NET Core提供了多种响应缓存配置方式,开发者可以根据接口的实际需求选择合适的配置方案,实现静态资源、接口数据的缓存控制,减少重复请求对服务器的资源消耗。

基于ResponseCache特性的配置
ResponseCache是ASP.NET Core内置的特性,可直接标注在控制器或者接口方法上,快速配置单个接口的缓存规则,是最常用的轻量级配置方式。
基础参数说明
ResponseCache特性包含多个核心参数,不同参数对应不同的缓存控制逻辑:
- Duration:缓存的持续时间,单位为秒,设置后会在响应头中添加Cache-Control: max-age=xxx
- Location:缓存存储的位置,可选值有Any(客户端和代理服务器都可缓存)、Client(仅客户端缓存)、None(不缓存)
- NoStore:是否禁止存储缓存,设置为true时会忽略Duration等参数,直接返回Cache-Control: no-store
- VaryByHeader:根据指定的请求头区分不同的缓存版本,比如根据Accept-Language返回不同语言的缓存
配置示例
以下是一个控制器方法的配置示例,该接口返回的用户列表数据会被客户端缓存60秒:
using Microsoft.AspNetCore.Mvc;
namespace DemoWeb.Controllers
{
[ApiController]
[Route("api/[controller]")]
public class UserController : ControllerBase
{
// 缓存60秒,允许客户端和代理服务器缓存,根据Accept请求头区分缓存版本
[ResponseCache(Duration = 60, Location = ResponseCacheLocation.Any, VaryByHeader = "Accept")]
[HttpGet("list")]
public IActionResult GetUserList()
{
var userList = new[]
{
new { Id = 1, Name = "张三" },
new { Id = 2, Name = "李四" }
};
return Ok(userList);
}
// 禁止缓存该接口
[ResponseCache(NoStore = true)]
[HttpGet("detail/{id}")]
public IActionResult GetUserDetail(int id)
{
var user = new { Id = id, Name = "测试用户" };
return Ok(user);
}
}
}
基于响应缓存中间件的配置
如果需要全局控制缓存规则,或者缓存静态资源,可以启用响应缓存中间件,中间件会在请求管道中统一处理缓存逻辑,优先级低于ResponseCache特性的配置。
中间件启用步骤
首先需要在Program.cs中注册响应缓存服务并启用中间件:
var builder = WebApplication.CreateBuilder(args); // 注册响应缓存服务 builder.Services.AddResponseCaching(); builder.Services.AddControllers(); var app = builder.Build(); // 启用响应缓存中间件,注意要放在路由中间件之前 app.UseResponseCaching(); app.UseRouting(); app.MapControllers(); app.Run();
中间件缓存规则配置
可以通过配置ResponseCachingOptions定制中间件的缓存行为,比如设置缓存的最大大小、支持的请求方法等:
builder.Services.AddResponseCaching(options =>
{
// 缓存的最大存储大小,单位为字节
options.MaximumBodySize = 1024 * 1024 * 10; // 10MB
// 是否缓存分块响应
options.UseCaseSensitivePaths = false;
// 允许的缓存请求方法,默认仅支持GET和HEAD
options.AllowedMethods = new[] { "GET", "HEAD", "POST" };
});
自定义缓存策略配置
如果默认的配置方式无法满足复杂场景的需求,比如需要根据请求参数、用户身份定制缓存规则,可以实现自定义的缓存策略提供者。
实现自定义策略
首先定义缓存策略类,实现IResponseCachePolicyProvider接口:
using Microsoft.AspNetCore.ResponseCaching;
using Microsoft.AspNetCore.ResponseCaching.Internal;
public class CustomResponseCachePolicy : IResponseCachePolicyProvider
{
public bool TryGetCacheKey(HttpContext httpContext, out string cacheKey)
{
cacheKey = null;
// 仅缓存GET请求
if (httpContext.Request.Method != "GET")
{
return false;
}
// 根据请求路径和查询参数生成缓存键
cacheKey = $"{httpContext.Request.Path}{httpContext.Request.QueryString}";
return true;
}
public bool TryGetCacheControl(HttpContext httpContext, out CacheControlHeaderValue cacheControl)
{
cacheControl = new CacheControlHeaderValue
{
MaxAge = TimeSpan.FromSeconds(30),
Public = true
};
return true;
}
}
注册自定义策略
在Program.cs中替换默认的缓存策略提供者:
builder.Services.AddSingleton<IResponseCachePolicyProvider, CustomResponseCachePolicy>();
配置注意事项
- 响应缓存仅对状态码为200的GET、HEAD请求生效,其他请求方法和状态码默认不会缓存
- 如果接口包含Set-Cookie响应头,默认不会进行缓存,需要手动配置缓存规则覆盖该行为
- 认证相关的接口建议设置NoStore为true,避免敏感数据被缓存泄露
- 开发环境中可以暂时关闭缓存,避免缓存导致接口修改后无法及时生效
响应缓存是性能优化的重要手段,但需要根据业务场景合理设置缓存时间,避免数据更新后用户获取到旧数据。
ASP.NET_Core响应缓存ResponseCache缓存中间件缓存策略修改时间:2026-07-20 12:18:29