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

ASP.NET 5中如何通过编程方式清除Cache Tag Helper缓存

ASP.NET 5 Razor 标签全局清除方案

你的需求完全可以实现。你之前尝试的反射清除IMemoryCache的方案失效,是因为Razor <cache> 标签的缓存键由框架内部生成,且.NET 5之后MemoryCache的内部属性名、访问权限存在版本差异,反射方案本身就有兼容性问题,不推荐使用。

推荐实现方案:全局缓存失效令牌

该方案无需依赖反射,完全兼容官方规范,可精准控制所有Razor缓存的全局失效,适配你修改内容后同步刷新前端的场景。

步骤1:定义全局令牌提供者

用于统一管理缓存失效信号:

using Microsoft.Extensions.Primitives;

public class CacheTokenProvider
{
    private CancellationTokenSource _cts = new CancellationTokenSource();

    // 获取当前缓存令牌
    public IChangeToken GetToken()
    {
        return new CancellationChangeToken(_cts.Token);
    }

    // 触发全局缓存失效
    public void ClearAllCache()
    {
        var oldTokenSource = _cts;
        _cts = new CancellationTokenSource();
        oldTokenSource.Dispose();
    }
}

步骤2:注册服务

在Program.cs中将令牌提供者注册为单例,确保全局共用同一个实例:

builder.Services.AddSingleton<CacheTokenProvider>();

步骤3:修改Razor缓存标签

在所有 <cache> 标签上绑定全局令牌,可先在Razor视图顶部注入服务,再添加vary-by-token属性:

@inject CacheTokenProvider CacheTokenProvider

<cache vary-by-token="@CacheTokenProvider.GetToken()" expires-after="@TimeSpan.FromMinutes(10)">
<!-- 原缓存内容 -->
</cache>

步骤4:实现缓存清空接口

在控制器中注入令牌提供者,调用清空方法即可让所有绑定了该令牌的缓存瞬间失效:

public class TestController : Controller
{
    private readonly CacheTokenProvider _cacheTokenProvider;

    public TestController(CacheTokenProvider cacheTokenProvider)
    {
        _cacheTokenProvider = cacheTokenProvider;
    }

    public IActionResult ClearCache()
    {
        _cacheTokenProvider.ClearAllCache();
        return Ok();
    }
}

方案优势

  • 无兼容性问题,所有ASP.NET Core版本均支持
  • 不会误删其他业务模块的缓存条目,可精准控制Razor缓存的生效失效
  • 支持按需触发,完全不需要依赖时间过期策略,内容修改后调用清空接口即可立即同步到前端

内容的提问来源于stack exchange,提问作者Petras

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 02:24:01