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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 04:36:05