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
相关产品推荐
相关产品推荐

