C# 如何检查System.Runtime.Caching.ObjectCache中的缓存策略?

C# 如何检查System.Runtime.Caching.ObjectCache中的缓存策略?,c#,asp.net,caching,memorycache,C#,Asp.net,Caching,Memorycache,我正在使用新的.NET4.0缓存命名空间:System.Runtime.Caching 现在,我正在做一些原型/摆弄新的API,以找出最适合实际应用的API 根据这一点,我正在尝试创建一个页面(ASP.NET MVC),该页面基本上会转储缓存中的所有内容,尤其是以下信息: 缓存密钥 缓存对象 缓存策略(到期日期等) 缓存依赖项(如果有) 然而,除了钥匙/物体,我似乎什么也得不到 以下是我目前正在使用的代码: public ActionResult Index() { var cache

我正在使用新的.NET4.0缓存命名空间:
System.Runtime.Caching

现在,我正在做一些原型/摆弄新的API,以找出最适合实际应用的API

根据这一点,我正在尝试创建一个页面(ASP.NET MVC),该页面基本上会转储缓存中的所有内容,尤其是以下信息:

  • 缓存密钥
  • 缓存对象
  • 缓存策略(到期日期等)
  • 缓存依赖项(如果有)
然而,除了钥匙/物体,我似乎什么也得不到

以下是我目前正在使用的代码:

public ActionResult Index()
{
   var cache = MemoryCache.Default;

   // i can get the list of cache keys like this:
   var cacheKeys = cache.Select(kvp => kvp.Key).ToList();

   // i can also get a strongly-typed "CacheItem" like this:
   CacheItem item = cache.GetCacheItem("someKey");

}
我希望“CacheItem”类能够公开我所需要的信息(到期日、依赖项等-至少作为“getter”)

但事实并非如此。它只有键、值和区域名称的属性

我如何检查缓存中的项目并吐出我需要的信息

是否缺少名称空间/类

编辑

看起来有一个类,但同样-这不会给出过期信息,它只允许您在删除缓存项时订阅事件

必须有一种方法来抓取缓存中的项,以及它们何时过期

编辑2


我不知道这是否应该是一个单独的问题,但我也不知道我应该给ObjectCache什么样的生命周期。MSDN说它不是一个单实例,实际上您可以创建多个ObjectCache实例。但是,这意味着什么,在访问ObjectCache实例时,我必须使用完全锁定的单例?

在我看来,在将CacheItemPolicy添加到缓存集合后,没有办法检索它

解决这一问题的最佳方法是将策略对象与要缓存的项一起缓存,但只需将“policy”附加到键名,以便以后检索策略。这显然是假设您首先可以控制将项实际添加到缓存中。示例如下:

public ActionResult Index()
    {
        string key = "Hello";
        string value = "World";

        var cache = MemoryCache.Default;
        CacheItemPolicy policy = new CacheItemPolicy();
        policy.AbsoluteExpiration = DateTime.Now.AddDays(1);
        cache.Add(new CacheItem(key, value), policy);
        cache.Add(new CacheItem(key + "Policy", policy), null);

        CacheItem item = cache.GetCacheItem(key);
        CacheItem policyItem = cache.GetCacheItem(key + "Policy");
        CacheItemPolicy policy2 = policyItem.Value as CacheItemPolicy;

        ViewBag.Message = key + " " + value;

        return View();
    }

我最近不得不为
MemoryCache
包装器创建单元测试。我想检查包装器是否使用预期的策略添加到基础缓存中

我提出了以下
GetCacheItemPolicy
扩展方法,该方法大量使用反射。尽管我的目的仅仅是对我的包装器进行单元测试,但我尝试优化每个反射,使其在性能重要的其他环境中可用(即使在生产代码中这样做,性能很可能并不重要,但是…)

内部静态类MemoryCacheExtensions
{
静态内存缓存扩展()
{
const BindingFlags flags=BindingFlags.Instance | BindingFlags.NonPublic;
表达式createGetterExpression=()=>CreateObjectGetter(null);
var genericCreateObjectGetterMethodInfo=((MethodCallExpression)createGetterExpression.Body).Method.GetGenericMethodDefinition();
//基本类型
var memoryCacheType=typeof(MemoryCache);
var getEntryMethodInfo=memoryCacheType.GetMethod(“GetEntry”,标志);
//MemoryCache输入字段
Assert(getEntryMethodInfo!=null,nameof(getEntryMethodInfo)+“!=null”);
var memoryCacheEntryType=getEntryMethodInfo.ReturnType;
var valueFieldInfo=memoryCacheEntryType.GetField(“\u值”,标志);
var usageBucketFieldInfo=memoryCacheEntryType.GetField(“\u usageBucket”,标志);
var removedcallbackfeldinfo=memoryCacheEntryType.GetField(“\u callback”,标志);
var seldomusedfeldsfieldinfo=memoryCacheEntryType.GetField(“\u fields”,标志);
var slidingExpirationFieldInfo=memoryCacheEntryType.GetField(“\u slidingExp”,标志);
var absoluteExpirationFieldInfo=memoryCacheEntryType.GetField(“\u utcabsepp”,标志);
//SeldomUsedFields字段
Assert(seldomusedfeldsfieldinfo!=null,nameof(seldomusedfeldsfieldinfo)+“!=null”);
var seldomusedfeldstype=seldomusedfeldsfieldinfo.FieldType;
var dependenciesFieldInfo=seldomusedfeldstype.GetField(“\u dependencies”,标志);
//哨兵阵地
var sentinelEntryType=memoryCacheType.GetNestedType(“SentinelEntry”,标志);
var updatecallbackfeldinfo=sentinelEntryType.GetField(“\u updateCallback”,标志);
GetMemoryCacheEntry=(Func)委托
.CreateDelegate(typeof(Func),getEntryMethodInfo);
Assert(valueFieldInfo!=null,nameof(valueFieldInfo)+“!=null”);
GetMemoryCacheEntryValue=(Func)genericCreateObjectGetterMethodInfo
.MakeGenericMethod(memoryCacheEntryType、valueFieldInfo.FieldType)
.Invoke(null,新对象[]{valueFieldInfo});
Assert(usageBucketFieldInfo!=null,nameof(usageBucketFieldInfo)+“!=null”);
GetMemoryCacheEntryUsageBucket=(Func)genericCreateObjectGetterMethodInfo
.MakeGenericMethod(memoryCacheEntryType,usageBucketFieldInfo.FieldType)
.Invoke(null,新对象[]{usageBucketFieldInfo});
Assert(removedcallbackfeldinfo!=null,nameof(removedcallbackfeldinfo)+“!=null”);
GetMemoryCacheEntryRemovedCallback=(Func)genericCreateObjectGetterMethodInfo
.MakeGenericMethod(memoryCacheEntryType,RemovedCallBackfeldInfo.FieldType)
.Invoke(null,新对象[]{removedcallbackfeldinfo});
GetMemoryCacheEntrySeldomUsedFields=(Func)genericCreateObjectGetterMethodInfo
.MakeGenericMethod(memoryCacheEntryType,seldomUsedFieldsFieldInfo.FieldType)
.Invoke(null,新对象[]{seldomUsedFieldsFieldInfo});
Assert(slidingExpirationFieldInfo!=null,nameof(slidingExpirationFieldInfo)+“!=null”);
GetMemoryCacheEntrySlidingExpiration=(Func)genericC