我正在尝试在 .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 实例时,它不包含任何内容。
您说问题是在您更改 dbcontext 设置时开始的,但显示的代码不显示 dbcontext。因此,我认为这在标记为
convert updates to list object
的代码中使用。
我猜这里的问题是您的列表包含连接到 dbcontext 的数据库对象,可能使用延迟加载;如果缓存了 dbcontext 绑定的对象,它将比 dbcontext 的寿命更长,并且任何延迟加载都将失败并出现所描述的症状。所以:不要这样做。仅缓存与任何复杂加载 API 完全分离的简单 POCO 类型。理想情况下:不可变,因此您不会因竞争请求更改共享实例而出现问题。