C# 为什么IMemoryCache';s TryGetValue是否引发InvalidOperationException?

C# 为什么IMemoryCache';s TryGetValue是否引发InvalidOperationException?,c#,caching,asp.net-core,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_mem

在我的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;
}
private async IList GetEntitiesAsync(字符串tenantId)
{
if(false==m_memoryCache.TryGetValue(tenantId,out-IList tenantities)| | tenantities.Count==0)
{
//打昂贵的电话。
IList Tenantenties=等待费用服务调用同步(tenantId);
m_memoryCache.Set(tenantId、tenantities、m_cacheEntryOptions);
}
归还租约;
}
但是,它确实会引发以下异常:

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

如Microsoft文档中所述,它指出:

内存缓存可以存储任何对象;分布式缓存 接口限制为字节[]

问题


我做错了什么?我不明白当我应该缓存一个
实体的列表时,为什么缓存会期望返回一个
字符串

我怀疑您在代码中的某个地方向缓存添加了一个
字符串
值,该值与您在这里使用的
tenantId
相同


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

我怀疑您在代码中的某个地方向缓存添加了一个
字符串
值,该值与您在此处使用的
tenantId
相同


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

只需检查一下,在构造函数中设置了m_memoryCache的局部变量,但在getEntityAsync方法中使用了m_cache。这只是一个输入错误吗?我怀疑在代码的某个地方,您正在向缓存中添加一个字符串值,该值与您在这里使用的租户相同。正确。这确实只是一个复制粘贴错误。也许可以尝试if(false==m_memoryCache.TryGetValue(tenantId,out object tenantities)看看从缓存中得到了什么你是对的…我没有意识到我们应用程序中的另一个类正在使用缓存和同一个键来存储它自己的信息…结果是另一个字符串。你能将此作为答案发布吗?只是检查一下,在构造函数中,你设置了局部变量m_memoryCache,但在GetEntitie中您使用m_cache的sAsync方法。这只是一个输入错误吗?我怀疑您的代码中的某个地方正在使用您在此处使用的相同tenantId向缓存添加字符串值。正确。这确实只是一个复制粘贴错误。也许可以尝试if(false==m_memoryCache.TryGetValue(tenantId,out object tenantities)看看缓存返回了什么你是对的…我没有意识到我们应用程序中的另一个类正在使用缓存和同一个键来存储它自己的信息…结果是另一个字符串。你能把这个作为答案吗?