【问题标题】:how do I cache an output in ASP.NET Core如何在 ASP.NET Core 中缓存输出
【发布时间】:2020-01-09 09:09:57
【问题描述】:

我有一个 API 控制器,场景是: 我需要使用第三方数据源(为了简单起见,假设第三方作为 dll 文件提供,并且 dll 包含 Student 模型和 StudentDataSource 包含很多检索学生的方法),并调用第三方数据源成本高,数据每 6 小时更新一次。 所以我需要以某种方式缓存输出,下面是我的 api 控制器的一些操作方法:

// api controller that contain action methods below

[HttpGet]
public JsonResult GetAllStudentRecords()
{
   var dataSource = new StudentDataSource();  
   return Json(dataSource.GetAllStudents());
}

[HttpGet("{id}")]
public JsonResult GetStudent(int id)
{
   var dataSource = new StudentDataSource();
   return Json(dataSource.getStudent(id));
}

那我应该如何缓存结果,尤其是对于第二种操作方法,缓存每个学生的结果具有不同的 id 是愚蠢的

【问题讨论】:

  • 缓存策略高度依赖于您的用例。几乎不可能提出适合所有系统的通用方法 - 如果您可以添加更多信息(您的 api 多久调用一次,底层数据源有多大,响应有多大,您所说的“昂贵的”,...)可能会提出一个方向。
  • 您可以尝试使用(System.Runtime.Caching 或 System.Web.Caching)。
  • 您可以使用IMemoryCache 来缓存结果
  • 您可以在 Asp Core 中使用 InMemoryCache:infoworld.com/article/3230129/…
  • @germi 那么如何缓存第二种操作方法的输出?我无法缓存具有不同 ID 的输出?

标签: c# .net web-services asp.net-core asp.net-core-mvc


【解决方案1】:

我的团队正在使用自定义操作过滤器属性在 API 控制器上实施类似的缓存策略来处理缓存逻辑。有关操作过滤器的更多信息,请参阅 here

Action 过滤器的OnActionExecuting 方法在您的控制器方法之前运行,因此您可以检查您要查找的数据是否已经缓存并直接从此处返回,缓存数据时绕过对第三方数据源的调用存在。我们也使用这种方法来检查请求的类型并在更新和删除时重置缓存,但听起来您不会修改数据。

Action 过滤器的OnActionExecuted 方法在您的控制器方法逻辑之后立即运行,让您有机会在将响应对象返回给客户端之前对其进行缓存。

如何实现实际缓存的具体细节很难提供答案,但 Microsoft 为 .NET Core 中的内存缓存提供了一些选项(请参阅MemoryCache.Default not available in .NET Core?

【讨论】:

    猜你喜欢
    • 2020-09-02
    • 2011-01-26
    • 1970-01-01
    • 2022-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-06
    • 1970-01-01
    相关资源
    最近更新 更多