.NET Core Custom Response Cache 如何按查询字符串布尔值判断是否缓存
.NET Core 基于查询字符串动态控制响应缓存实现方案
核心实现思路
通过自定义响应缓存策略提供器替代官方默认实现,在请求进入缓存逻辑时优先读取查询字符串中的布尔标识,动态判定当前请求是否需要启用缓存,全程无业务代码侵入。
实现步骤
步骤1:自定义缓存策略提供器
实现IResponseCachePolicyProvider接口,在方法内优先读取查询参数判断缓存开关状态:
using Microsoft.AspNetCore.ResponseCaching; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Options; public class DynamicQueryCachePolicyProvider : IResponseCachePolicyProvider { private readonly DefaultResponseCachePolicyProvider _defaultProvider; public DynamicQueryCachePolicyProvider(IOptions<ResponseCachingOptions> options) { // 保留默认提供器,满足正常缓存场景的需求 _defaultProvider = new DefaultResponseCachePolicyProvider(options); } public async ValueTask<ResponseCachingPolicy> GetCachePolicyAsync(HttpContext context) { // 读取查询字符串中的缓存控制参数,示例参数名为enableCache if (context.Request.Query.TryGetValue("enableCache", out var value) && bool.TryParse(value, out var enableCache) && !enableCache) { // 参数为false时直接返回禁用缓存的策略 return new ResponseCachingPolicy { IsCacheable = false, AllowCacheLookup = false, AllowCacheStorage = false }; } // 其他情况走默认缓存逻辑 return await _defaultProvider.GetCachePolicyAsync(context); } }
步骤2:替换官方默认缓存策略提供器
在Program.cs中注册响应缓存服务,同时替换默认的策略提供器实现:
var builder = WebApplication.CreateBuilder(args); // 注册响应缓存基础服务 builder.Services.AddResponseCaching(); // 替换默认策略提供器为自定义实现 builder.Services.AddSingleton<IResponseCachePolicyProvider, DynamicQueryCachePolicyProvider>(); // 其他服务注册逻辑... var app = builder.Build(); // 注意中间件顺序:必须放在UseRouting之后,接口执行之前 app.UseRouting(); app.UseResponseCaching(); app.MapControllers(); app.Run();
步骤3:接口标注缓存规则
在需要支持动态缓存的接口上使用[ResponseCache]特性配置基础缓存规则:
[ApiController] [Route("test")] public class TestController : ControllerBase { // 示例配置:缓存时长30秒,按所有查询参数区分缓存键 [HttpGet] [ResponseCache(Duration = 30, VaryByQueryKeys = new[] { "*" })] public string GetCurrentTime() { return DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); } }
效果验证
- 调用
/test?enableCache=true:30秒内重复请求返回的时间戳一致,缓存生效 - 调用
/test?enableCache=false:每次请求返回最新时间戳,不会读取或写入缓存
扩展提示
- 如需仅针对特定接口启用动态判断,可在自定义策略提供器中添加路由路径匹配逻辑
- 缓存控制参数名称可提取到配置文件中,避免硬编码
- 如需结合请求头、身份信息等其他维度判断缓存逻辑,可直接在
GetCachePolicyAsync方法中扩展对应判断即可
内容的提问来源于stack exchange,提问作者Blackerback
相关产品推荐
相关产品推荐

