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

如何在ASP.NET Core中以编程方式清除Cache Tag Helper缓存?

在ASP.NET Core中编程清除Razor <cache>标签的缓存

当然可行,这个需求完全可以实现。针对Razor模板里的<cache>标签(即Cache Tag Helper),有几种实用的方式来编程清除缓存,适配你修改内容后更新前端展示的场景:


方法一:使用缓存令牌(最推荐)

这种方式通过取消令牌让所有关联的缓存自动失效,支持内存缓存和分布式缓存,实现简单可靠:

  1. 定义缓存令牌持有者类
    创建一个单例类来管理缓存失效令牌:

    public class CacheTokenHolder
    {
        private CancellationTokenSource _tokenSource = new CancellationTokenSource();
    
        public CancellationToken Token => _tokenSource.Token;
    
        public void ResetCache()
        {
            _tokenSource.Cancel();
            _tokenSource.Dispose();
            _tokenSource = new CancellationTokenSource();
        }
    }
    
  2. 注册单例服务
    在Program.cs(或Startup.cs)中注册这个类为单例:

    builder.Services.AddSingleton<CacheTokenHolder>();
    
  3. 在Razor视图中关联令牌
    在使用<cache>标签的视图里注入CacheTokenHolder,并绑定缓存失效令牌:

    @inject CacheTokenHolder CacheTokenHolder
    
    <cache expires-after="@TimeSpan.FromSeconds(3600)" cache-expiration-token="@CacheTokenHolder.Token">
        <!-- 你的缓存内容,比如动态渲染的页面内容 -->
        @await Html.PartialAsync("_ContentPartial")
    </cache>
    
  4. 触发缓存清除
    在内容修改的业务逻辑(比如后台编辑接口、内容保存方法)中,注入CacheTokenHolder并调用ResetCache():

    public class ContentEditorService
    {
        private readonly CacheTokenHolder _cacheTokenHolder;
    
        public ContentEditorService(CacheTokenHolder cacheTokenHolder)
        {
            _cacheTokenHolder = cacheTokenHolder;
        }
    
        public async Task SaveContentAsync(ContentModel model)
        {
            // 执行内容保存逻辑
            await _contentRepository.SaveAsync(model);
            
            // 清除所有关联的缓存
            _cacheTokenHolder.ResetCache();
        }
    }
    

    调用ResetCache()后,所有绑定了该令牌的<cache>内容会立即失效,下次请求时会重新生成缓存。


方法二:使用缓存分区(针对特定分组缓存)

如果你只需要清除某一类缓存(比如所有内容页缓存),可以给<cache>标签指定分区:

  1. 在视图中设置缓存分区

    <cache name="ContentPages" partition="SiteContent" expires-after="@TimeSpan.FromSeconds(3600)">
        <!-- 内容页缓存内容 -->
    </cache>
    
  2. 清除指定分区的缓存
    注入IMemoryCache(或IDistributedCache,如果用分布式缓存),然后根据分区生成对应缓存键并删除。注意Cache Tag Helper的缓存键遵循内部生成规则,更稳妥的方式是结合方法一的令牌机制来分区管理缓存,避免依赖内部API带来的兼容性问题。


不推荐的方式:遍历删除缓存

如果使用内存缓存,你可能会想到通过反射遍历IMemoryCache的所有条目并删除,但这种方式依赖框架内部实现,版本更新可能失效,且在分布式缓存场景下完全不可用,因此不推荐。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 15:09:24