是否可以将 .Net Core 配置为使用文件系统来缓存响应?

Is it possible to configure .Net Core to use the file system to cache responses?

具体来说,.Net Core(3.0 或更早版本)是否有任何方法可以将本地文件系统用作响应缓存而不是仅在内存中?

经过大量研究,最接近的似乎是 Response Caching 中间件 [1],但这不是:

  1. 允许无限期缓存页面,
  2. 在应用程序和服务器重启之间保留缓存,
  3. 允许在每页的基础上使缓存失效(例如更新的博客条目),
  4. 允许在进行全局更改(例如主题更新、菜单更改等)时使整个缓存失效。

我猜测这些功能将需要命中本地文件系统的 ResponseCaching 的自定义实现,但如果它已经存在,我不想重新发明它。

一些背景:

这将取代我们对静态站点生成器的使用,由于数据量巨大(生成并复制到所有服务器需要将近 24 小时),这对于站点范围内的更改是有问题的。

场景与百科全书或新闻网站非常相似 -- 绝大多数内容不经常更改,每天添加一些内容,并且没有用户特定的内容(如果或何时有,它将通过 JS/Ajax) 动态加载。此外,页面加载恰好 processor/memory/database 密集。

我们将使用像 CloudFlare 或 AWS CloudFront 这样的反向代理,但 AWS 每天都会自动过期它们的边缘缓存。边缘节点缓存未命中仍然很频繁。

这与 IDistributedCache [2] 的不同之处在于它应该是响应缓存,而不仅仅是缓存 MVC 模型使用的数据。

我们还将使用内存缓存 [3],但同样,这解决了不同的缓存方案。

参考资料

[1] https://docs.microsoft.com/en-us/aspnet/core/performance/caching/middleware

[2]https://docs.microsoft.com/en-us/aspnet/core/performance/caching/distributed

[3] https://docs.microsoft.com/en-us/aspnet/core/performance/caching/memory

目前(2019 年 4 月)答案似乎是:,对此没有任何开箱即用的东西。

使用 .Net Core 可以通过三种可行的方法实现此目的:

  1. 分叉内置的 ResponseCaching 中间件并为缓存到磁盘创建标志:

    https://github.com/aspnet/AspNetCore/tree/master/src/Middleware/ResponseCaching

    维护起来可能很烦人,因为命名空间和 class 名称会与核心框架发生冲突。

  2. 在 EasyCaching 中实现这个缺失的功能,它显然已经在他们的雷达上缓存到磁盘:

    https://github.com/dotnetcore/EasyCaching/blob/master/ToDoList.md

    拉取请求更有可能被接受,因为它是计划中的功能。

  3. 显然有一个 Strathweb.CacheOutput 到 .Net Core 的端口,这将允许实现 IApiOutputCache 以保存到磁盘:

    https://github.com/Iamcerba/AspNetCore.CacheOutput#server-side-caching

尽管这个问题是关于使用本地文件系统在 .Net Core 中进行缓存的,但这也可以通过在每个服务器节点上使用 Sqlite 的本地实例来完成,然后配置 EasyCaching 以进行响应缓存并将其指向本地主机上的 Sqlite 实例。

我希望这对遇到这种情况的其他人有所帮助!

我实现了这个。 https://www.nuget.org/packages/AspNetCore.ResponseCaching.Extensions/ https://github.com/speige/AspNetCore.ResponseCaching.Extensions

不过还不支持.net core 3。