从 C# 中获取 <cache> 标签助手的 vary-by 属性值
Get value of vary-by attribute of <cache> tag helper from c#
我想通过标签助手生成的特定键来清除内存缓存。可以使用以下代码清除缓存标签生成的整个内存缓存。
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的值吗
我能够获取“_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);
}
}
}
}
我想通过标签助手生成的特定键来清除内存缓存。可以使用以下代码清除缓存标签生成的整个内存缓存。
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的值吗
我能够获取“_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);
}
}
}
}