在CRM Online中使用C#进行对象缓存

在CRM Online中使用C#进行对象缓存,c#,dynamics-crm-2013,dynamics-365,C#,Dynamics Crm 2013,Dynamics 365,我在C#中使用对象缓存在缓存中存储EntityCollection 以下是缓存的代码: ObjectCache cache = MemoryCache.Default; const string keyName = "BrandPartners"; EntityCollection result; if (!cache.Contains(keyName)) { result = GetCustomerData(service, firstName, lastName, gender);

我在C#中使用对象缓存在缓存中存储EntityCollection

以下是缓存的代码:

ObjectCache cache = MemoryCache.Default;
const string keyName = "BrandPartners";
EntityCollection result;

if (!cache.Contains(keyName))
{
    result = GetCustomerData(service, firstName, lastName, gender);
    var cacheItemPolicy = new CacheItemPolicy()
    {
        AbsoluteExpiration = DateTime.Now.AddMinutes(5)
    };

    tracingService.Trace("Writing into the cache");
    cache.Add(keyName, result, cacheItemPolicy);
}
else
{
    result = (EntityCollection)cache.Get(keyName);
    tracingService.Trace("Data already found in the cache");
}
因此,当我第一次在CRM online中的实例中的实体中创建记录时,我得到了跟踪:“写入缓存”

但是,当我再次在同一实体中创建记录时,我再次得到相同的跟踪(“写入缓存”)。但是,如果我使用缓存,我不应该得到这个跟踪,因为缓存中已经存在“BrandPartners”的键名


那么,我做错了什么呢?

以下是一些可能的原因,可以解释为什么找不到缓存值:

  • 您使用的是CRM online,或prem,并且具有适当的负载平衡。内存缓存显然只适用于单个计算机上的单个进程
  • 在沙箱模式下为多个工作流/实体注册工作流活动。在这种情况下,每个注册实例都将获得一个单独的沙盒进程,因此将具有单独的内存缓存
  • CRM决定刷新插件沙盒过程。这种情况时有发生,以避免内存泄漏,因此也可能是这样

两个创建操作之间的间隔时间是多少?由于您的
CacheItemPolicy
,缓存在5分钟后过期。代码在哪里执行?@JamesWood,这是一个自定义工作流。因此,我将其作为工作流中的一个步骤执行。在两个创建操作之间,时间为1分钟。我给计时器的时间是5分钟,只是为了测试。我们有解决方案吗?@RichaTibrewal哪种可能的情况适用于您?我在CRM online上。@Richa Tibrewal在某些情况下会使用内存缓存,但在很多情况下不会。我不确定除了使用Redis之类的东西之外还有什么解决方案。。。