示例工程【免费下载链接】practical-aspnetcorePractical samples of ASP.NET Core 11, 10, 9, 8.0, 7.0, 6.0, 5.0, 3.1, 2.2, and 2.1,projects you can use. Readme contains explanations on all projects.项目地址https://gitcode.com/gh_mirrors/pr/practical-aspnetcore点击查看免费下载本文以 practical-aspnetcore 仓库中的 output-cache-1 示例为主线讲解 ASP.NET Core 输出缓存Output Cache中间件的最基本用法从服务注册、中间件挂载到端点级.CacheOutput()标记并深入解析默认过期时间1 分钟与默认最大可缓存响应体大小64 MB两个核心默认值。读完本文你将能独立复现一个最小可运行的输出缓存应用并理解缓存命中与未命中时服务端行为的差异为后续学习按查询字符串区分缓存、按标签批量驱逐等进阶用法打下基础。一、什么是输出缓存Output Cache输出缓存是 ASP.NET Core 内置的一种服务端缓存机制它在响应生成之后、发送给客户端之前将完整的 HTTP 响应状态码、响应头和响应体缓存起来。当相同请求再次到达时中间件直接复用缓存中的响应不再执行端点的处理逻辑从而显著降低后端计算与数据库访问压力。practical-aspnetcore 仓库在 output-cache-middleware 目录下用 8 个递进式示例系统展示了这一能力示例主题output-cache-1最基础的输出缓存用法本文重点output-cache-2按一个或多个查询字符串区分缓存output-cache-3为缓存项打标签并按标签批量驱逐IOutputCacheStore.EvictByTagAsyncoutput-cache-4通过全局 base policy 为所有端点开启缓存output-cache-5基于HttpContext判定仅缓存带cache查询字符串参数的请求output-cache-6基于HttpContext判定仅缓存 URL 路径以/cache开头的请求output-cache-7命名策略policy覆盖全局 base policyoutput-cache-8自定义策略将过期时间设为 10 分钟此外仓库 net11/output-cache-policy-provider 还展示了 .NET 11 Preview 新增的IOutputCachePolicyProvider动态策略接口可以按租户等维度动态决定缓存策略。二、最小可运行示例output-cache-1 完整源码output-cache-1 是一个极简 可对比的演示它同时暴露一个不缓存的端点和缓存的端点都返回DateTime.UtcNow让读者直观看到缓存生效前后时间戳是否变化。完整实现见 Program.csvar builder WebApplication.CreateBuilder(args); builder.Services.AddOutputCache(); var app builder.Build(); app.MapGet(/, () { return Results.Content( html body ul lia href/nowDateTime.UtcNow()/a/li lia href/cached-nowDateTime.UtcNow() cached/a/li /ul /body /html , text/html); }); app.UseOutputCache(); app.MapGet(/now, () DateTime.UtcNow.ToString()); app.MapGet(/cached-now, () DateTime.UtcNow.ToString()).CacheOutput(); app.Run();整个应用只有三个关键步骤这也是所有输出缓存示例共通的骨架注册服务builder.Services.AddOutputCache()将输出缓存所需的中间件服务含默认的IOutputCacheStore注册进依赖注入容器挂载中间件app.UseOutputCache()把中间件插入请求处理管道。它必须放在MapGet等端点定义之前才能拦截并缓存响应标记端点.CacheOutput()扩展方法把缓存行为应用到指定端点。项目文件 output-cache-1.csproj 基于Microsoft.NET.Sdk.Web目标框架为net10.0与仓库根目录 global.json 中声明的 SDK 10.0.0 一致使用ImplicitUsings因此无需显式using Microsoft.AspNetCore.OutputCaching即可使用CacheOutput()需要显式引用该命名空间时可参考 output-cache-3/Program.cs 顶部的写法。运行与验证cd projects/output-cache-middleware/output-cache-1 dotnet run浏览器打开http://localhost:5000后反复刷新/now每次显示的DateTime.UtcNow都在变化——该端点未启用缓存反复刷新/cached-now在默认 1 分钟过期时间内时间戳始终不变——第一次请求生成的响应被缓存并直接复用。也可以在命令行中对比观察在 1 分钟窗口内连续执行两次第二次会得到完全相同的响应体curl http://localhost:5000/cached-now curl http://localhost:5000/cached-now三、两个关键默认值1 分钟过期与 64 MB 响应体上限原文档明确指出本示例使用零配置方式因此生效的是OutputCacheOptions的默认值其中两个最值得关注默认项值说明默认过期时间DefaultExpirationTimeSpan1 分钟60 秒缓存项在 1 分钟后过期下次请求会重新执行端点并生成新响应默认最大可缓存响应体大小MaximumBodySize64 MB响应体超过 64 MB 的响应不会被缓存流式/超大响应不受影响原文档对这些默认值的出处指向 ASP.NET Core 框架源码中的OutputCacheOptions类src/Middleware/OutputCaching/src/OutputCacheOptions.cs这两个数值是框架层面的既有实现事实。理解这两个默认值对生产调优很重要1 分钟过期意味着新鲜度敏感的内容比如示例中的时间戳、行情、库存等默认最多滞后 1 分钟如果需要更长或更短的保鲜期必须自定义策略见下文第五节。64 MB 上限保证了缓存不会因单个超大响应如大文件下载而撑爆内存AddOutputCache时传入的配置委托可以修改它。其余默认行为还包括默认策略要求响应具有可缓存条件如Cache-Control: public语义、非 200 状态码默认不缓存等这些由框架中间件根据 HTTP 语义自动判定示例中返回 200 的普通 GET 响应均满足条件。四、深入源码为什么CacheOutput()只影响标记的端点output-cache-1 最有教学价值的细节是同一个应用里/now不缓存/cached-now缓存。区别仅在于后者末尾多了.CacheOutput()。从源码结构可以推断其机制.CacheOutput()本质上是给端点附加元数据endpoint metadata声明该端点应用输出缓存策略UseOutputCache()挂载的中间件在处理请求时会先检查当前匹配端点是否携带这份元数据。只有携带元数据的端点才进入缓存判定流程未标记的/now直接穿透中间件正常执行这也是为什么示例中必须先app.UseOutputCache()、再定义带.CacheOutput()的端点——中间件需要位于管道中端点执行之前的位置。如果要为每一个端点都开启缓存则无需逐个标记改用全局 base policy 即可。仓库 output-cache-4/Program.cs 给出了写法builder.Services.AddOutputCache(options { options.AddBasePolicy(builder builder.With(c true)); });此时/now、/random等所有端点都会被缓存同样遵循默认 1 分钟过期。五、进阶延伸从基础用法到策略化配置output-cache-1 是起点仓库同目录下的后续示例正好构成一条完整的进阶路线与本文主题一脉相承可作为实战延伸阅读1. 按查询字符串区分缓存output-cache-2同一个端点?version1与?version2应视为不同缓存项app.MapGet(/cached-now, () DateTime.UtcNow.ToString()) .CacheOutput(p p.SetVaryByQuery(version, culture));核心代码见 output-cache-2/Program.csSetVaryByQuery可接收多个参数名。2. 打标签并按标签批量驱逐output-cache-3app.MapGet(/cached-now-tagged, () DateTime.UtcNow.ToString()) .CacheOutput(p p.Tag(datetime)); app.MapGet(/clear, async (IOutputCacheStore cache) { await cache.EvictByTagAsync(datetime, CancellationToken.None); return Results.Ok(new { message ... }); });核心代码见 output-cache-3/Program.cs。通过注入IOutputCacheStore调用EvictByTagAsync可一次清除所有带datetime标签的缓存项——这是内容变更后主动失效缓存的推荐方式。3. 基于 HttpContext 的全局判定output-cache-5、output-cache-6缓存策略可以直接读取当前请求上下文实现按条件缓存// 仅缓存带 cache 查询字符串参数的请求 options.AddBasePolicy(builder builder.With(c c.HttpContext.Request.QueryString.Value?.Contains(cache) ?? false));// 仅缓存路径以 /cached 开头的请求 options.AddBasePolicy(builder builder.With(c c.HttpContext.Request.Path.StartsWithSegments(/cached)));分别见 output-cache-5/Program.cs 与 output-cache-6/Program.cs。4. 命名策略覆盖全局策略output-cache-7、output-cache-8先注册全局 base policy再注册命名策略命名策略在端点上显式引用后会覆盖全局默认builder.Services.AddOutputCache(options { options.AddBasePolicy(builder builder.With(c c.HttpContext.Request.Path.StartsWithSegments(/cached))); options.AddPolicy(NoCache, o o.NoCache()); // 不缓存 options.AddPolicy(10Minutes, o o.Expire(TimeSpan.FromMinutes(10))); // 10 分钟过期 }); app.MapGet(/cached/now-nope, () DateTime.UtcNow.ToString()).CacheOutput(10Minutes);分别见 output-cache-7/Program.cs 与 output-cache-8/Program.cs。o.Expire(TimeSpan.FromMinutes(10))正是对默认 1 分钟过期这一默认值的直接定制示例。5. .NET 11 动态策略提供器net11/output-cache-policy-provider仓库还收录了较新的IOutputCachePolicyProvider接口示例可从配置、数据库动态加载策略或按X-Tenant请求头区分不同租户的缓存副本见 projects/net11/output-cache-policy-provider/Program.cs 与 README.md。六、使用注意事项小结基于 output-cache-1 及其同目录示例可以总结出几条直接可用的实践要点三步齐备AddOutputCache()注册 →UseOutputCache()挂载 → 端点.CacheOutput()标记缺一不可默认过期 1 分钟对新鲜度有要求的接口要自定义Expire对不要求新鲜的接口1 分钟内的重复请求可以零成本命中缓存默认响应体上限 64 MB超大响应不会被缓存这是内存保护机制而非缺陷主动失效用标签数据变更时优先考虑TagEvictByTagAsync而不是等待自然过期全局 vs 端点级默认策略只作用于标记过的端点想全量缓存需AddBasePolicy(builder builder.With(c true))。七、进一步阅读本示例说明文档output-cache-1/Readme.md整个输出缓存系列导航与说明output-cache-middleware/readme.md同主题现代实现net11/output-cache-policy-provider/README.md仓库还提供 clean.sh 与 restore.sh 批量清理/还原各示例项目的辅助脚本可在复现运行前使用。赞分享示例工程【免费下载链接】practical-aspnetcorePractical samples of ASP.NET Core 11, 10, 9, 8.0, 7.0, 6.0, 5.0, 3.1, 2.2, and 2.1,projects you can use. Readme contains explanations on all projects.项目地址https://gitcode.com/gh_mirrors/pr/practical-aspnetcore点击查看免费下载相关推荐ASP.NET Core 输出缓存策略为接口设置 10 分钟过期时间的实战示例practical-aspnetcore 的 output-cache-8ASP.NET Core 输出缓存策略为接口设置 10 分钟过期时间的实战示例practical aspnetcore 的 output cache 8示例工程imu_utils进阶如何处理不同采样率的IMU数据并提升分析精度imu_utils进阶如何处理不同采样率的IMU数据并提升分析精度 imu_utils是一款强大的ROS包工具专为分析IMU性能而设计。在实际应用中不同I智能硬件数据分析ASP.NET Core 输出缓存策略实战基础策略、具名策略与覆盖机制基于 practical-aspnetcore output-cache-7ASP.NET Core 输出缓存策略实战基础策略、具名策略与覆盖机制基于 practical aspnetcore output cache 7 导读示例工程上一篇IronClaw 多供应商 LLM 集成模块ironclaw_llm权威指南Provider 契约、选择机制与可靠性装饰器链下一篇KMS激活终极指南3分钟完成Windows和Office永久免费激活创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考