ASP.NET Core 中的响应缓存如何配置?

来源:3D模型作者:重启一下头衔:草根站长
导读:本期聚焦于小伙伴创作的《ASP.NET Core 中的响应缓存如何配置?》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《ASP.NET Core 中的响应缓存如何配置?》有用,将其分享出去将是对创作者最好的鼓励。

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

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

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。