【问题标题】:Get value of vary-by attribute of <cache> tag helper from c#从 c# 获取 <cache> 标签助手的可变属性值
【发布时间】:2022-01-13 06:03:36
【问题描述】:

我想通过标签助手生成的特定键清除内存缓存。使用下面的代码可以清除缓存标签生成的整个内存缓存。

public partial class MemoryCacheManager : CacheKeyService, ILocker, IStaticCacheManager
{
    private readonly CacheTagHelperMemoryCacheFactory _factory;
    public MemoryCacheManager(AppSettings appSettings, IMemoryCache memoryCache, 
                        CacheTagHelperMemoryCacheFactory factory) : base(appSettings)
    {
        _memoryCache = memoryCache;
        _factory = factory;
    }

    public Task ClearAsync()
    {
        PropertyInfo prop = _factory.Cache.GetType().GetProperty("EntriesCollection", BindingFlags.Instance | BindingFlags.GetProperty | BindingFlags.NonPublic | BindingFlags.Public);
        var allInnerCacheTags = prop.GetValue(_factory.Cache) as ICollection;

        foreach (var item in allInnerCacheTags)
        {
            object cacheKeyOfTag = item.GetType().GetProperty("Key",  BindingFlags.Instance | BindingFlags.GetProperty | BindingFlags.NonPublic | BindingFlags.Public);
            _memoryCache.Remove(cacheKeyOfTag);
        }
    }
}

但我想通过特定键删除缓存条目,如附加图像。

有什么方法可以获取 _varyBy 的值。

【问题讨论】:

  • 这个 _varby 是自定义属性还是缓存属性?是否要单独提取该属性的值?
  • @await Component.InvokeAsync("TopMenu") 在剃刀视图中,我正在使用上面的代码,从 c# 端,我可以看到值。所以我想得到那个值。因为我不想清除整个字典而不是单个项目,所以我想从内存中清除该特定条目。

标签: c# asp.net-core .net-core caching in-memory-cache


【解决方案1】:

我能够得到“_varyBy”的值。下面的代码适用于我net5.0。假设也适用于 net3.2

public partial class MemoryCacheManager
{
    private readonly CacheTagHelperMemoryCacheFactory _factory;
    private readonly IMemoryCache _memoryCache;

    public MemoryCacheManager(IMemoryCache memoryCache, 
                              CacheTagHelperMemoryCacheFactory factory)
    {
        _memoryCache = memoryCache;
        _factory = factory;
    }

    public void ClearCacheTagAsync(string cachekey)
    {
        PropertyInfo prop = _factory.Cache.GetType().GetProperty("EntriesCollection", BindingFlags.Instance | BindingFlags.GetProperty | BindingFlags.NonPublic | BindingFlags.Public);
        var allInnerCacheTags = prop.GetValue(_factory.Cache) as ICollection;
        foreach (var cacheEntry in allInnerCacheTags)
        {
            var theKeyValueOfEntry = cacheEntry.GetType().GetProperties().ToDictionary(property => property.Name, property => property.GetValue(cacheEntry));

            var item = theKeyValueOfEntry.FirstOrDefault();
            var cacheTag = ((CacheTagKey)item.Value);
            var field = cacheTag.GetType().GetField("_varyBy", BindingFlags.NonPublic | BindingFlags.Instance);
            var actualValue = field.GetValue(cacheTag);

            if (cachekey == actualValue.ToString())
            {
                _memoryCache.Remove(cacheEntry);
            }
        }
    }    
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-08
    • 2019-11-26
    相关资源
    最近更新 更多