为什么IMemoryCache的TryGetValue抛出InvalidOperationException?

时间:2018-10-19 12:09:35

标签: c# caching asp.net-core

在Web应用程序中,我有一项服务使用注入的IMemoryCache

public class InternalService
{
    private readonly IMemoryCache m_memoryCache;

    private readonly MemoryCacheEntryOptions m_cacheEntryOptions;

    public Service(IMemoryCache memoryCache)
    {
         m_memoryCache = memoryCache;

         // Set cache options: keep in cache for this time, reset time in 1 hour, no matter what.
        m_cacheEntryOptions = new MemoryCacheEntryOptions().SetAbsoluteExpiration(TimeSpan.FromHours(1d));
    }
} 

在此服务中,我正在使用缓存来避免昂贵的通话。调用返回一个实体列表:

public class Entity
{
    public long Id {get; set;}    
}

以下是服务中处理缓存的方法:

private async IList<Entity> GetEntitiesAsync(string tenantId)
{
    if (false == m_memoryCache.TryGetValue(tenantId, out IList<Entity> tenantEntities) || tenantEntities.Count == 0)
    {
         // Do the expensive call.
         IList<Entity> tenantEntities = await ExpensiveServiceCallAsync(tenantId);

         m_memoryCache.Set(tenantId, tenantEntities , m_cacheEntryOptions);
    }

    return tenantEntities;
}

但是,它确实引发了以下异常:

  

System.InvalidCastException:无法转换类型的对象   “ System.String”以键入“ System.Collections.Generic.IList`1 [Entity]”。   在   Microsoft.Extensions.Caching.Memory.CacheExtensions.TryGetValue [TItem](IMemoryCache   缓存,对象键,TItem&值)

如Microsoft文档中所述,它表示:

  

内存缓存可以存储任何对象;分布式缓存   接口仅限于byte []。

问题

我在做什么错?我不明白当我应该缓存string的列表时,为什么缓存期望返回Entity

1 个答案:

答案 0 :(得分:2)

我怀疑您在代码中的某个位置将string值添加到了与此处使用的tenantId相同的缓存中。

请记住,m_memoryCache实例已在您的整个代码中使用。