无法访问已处置的对象MemoryCache

问题描述 投票:0回答:1

我正在尝试在 .NET 8 中的最小 API 操作中使用 IMemoryCache,如下所示:

public static async Task<Results<Accepted, ProblemHttpResult>> GetUpdates(
    [FromServices] IMemoryCache memoryCache,
    HttpContext context)
{
    try
    {
        using var reader = new StreamReader(context.Request.Body);
        string updates = await reader.ReadToEndAsync();
        var list = // convert updates to list object

        memoryCache.Set("Updates", list);

        return TypedResults.Accepted("/");
    }
    catch (Exception ex)
    {
        return TypedResults.Problem(ex.Message);
    }
}

之前工作正常,由于一些问题将 DBContext 从 Singleton 更改为 Scoped,之后我在尝试使用内存缓存时遇到了这个问题。

使用 IMemoryCache 存储对象列表,并将在 AutoMapper 映射配置文件中检索它们(该字段需要经常更新)。

尝试使用 IMemoryCache 作为作用域,它没有抛出任何错误,但是在映射配置文件类中获取 IMemoryCache 实例时,它不包含任何内容。

c# asp.net-core .net-core dependency-injection in-memory-cache
1个回答
0
投票

您说问题是在您更改 dbcontext 设置时开始的,但显示的代码不显示 dbcontext。因此,我认为这在标记为

convert updates to list object
的代码中使用。

我猜这里的问题是您的列表包含连接到 dbcontext 的数据库对象,可能使用延迟加载;如果缓存了 dbcontext 绑定的对象,它将比 dbcontext 的寿命更长,并且任何延迟加载都将失败并出现所描述的症状。所以:不要这样做。仅缓存与任何复杂加载 API 完全分离的简单 POCO 类型。理想情况下:不可变,因此您不会因竞争请求更改共享实例而出现问题。

© www.soinside.com 2019 - 2024. All rights reserved.