获取ASP.NET Core 1中的所有缓存

Mic*_*Mao 5 c# asp.net asp.net-core

版本是rc1.在我的旧项目中,有类似的代码

System.Web.Caching.Cache c = System.Web.HttpRuntime.Cache;
System.Collections.IDictionaryEnumerator cacheEnumerator = c.GetEnumerator();
while (cacheEnumerator.MoveNext())
{....}
Run Code Online (Sandbox Code Playgroud)

在我使用的核心1中IMemoryCache,我可以通过密钥获得缓存

var c = this._memoryCache;
var data = c.Get("data");
Run Code Online (Sandbox Code Playgroud)

我想创建一个列出所有缓存的视图.如何在Core 1中获取所有缓存?

Avn*_*tan 5

github上查看ASP.NET Core的MemoryCache实现的源代码,您可以看到该类没有公开任何扫描或迭代缓存条目列表的功能.

您最接近的是使用反射来读取内部缓存字典:

 private readonly Dictionary<object, CacheEntry> _entries;
Run Code Online (Sandbox Code Playgroud)

将反射代码包装在一个扩展方法中,该方法接受IMemoryCache并返回一个IEnumerable<CacheEntry>并且你很好 - 但是涉及到几个风险:

  1. 此实现特定于当前的预发布版本的ASP.NET CORE.这可能会在较新的版本中发生变化,因为它是内部实现细节而不是合同的一部分.
  2. 这特定于Microsoft.Extensions.Caching.Memory.MemoryCache的实现,它只是一个实现IMemoryCache.您可能有一天会用不同的实现替换它,这会破坏.
  3. 该实现包含一组锁,用于管理对缓存条目的并发访问.如果直接迭代内部字典,当您尝试在更新条目时读取条目时,可能会遇到并发错误.第一步是永远不要直接更新缓存条目,并且总是通过IMemoryCache方法,但即使这样,也存在风险.

但是,了解风险,您可以前进并完成工作.