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

时间:2019-04-14 01:34:02

标签: asp.net-core asp.net-core-mvc asp.net-core-middleware

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

经过大量研究,最近的东西似乎是响应缓存中间件[1],但这不是:

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

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

某些背景:

这将代替我们使用静态站点生成器,该站点生成器因数据量巨大(将近24小时生成并复制到所有服务器)而在整个站点范围内发生更改。

这种情况与百科全书库或新闻站点非常相似-绝大多数内容很少更改,每天都会添加一些内容,并且没有用户特定的内容(如果有的话,将通过JS / Ajax动态加载)。另外,页面加载恰好占用大量处理器/内存/数据库。

我们将使用反向代理,例如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

2 个答案:

答案 0 :(得分:1)

答案 1 :(得分:-1)

当前(2019年4月)的答案似乎是:,对此没有现成的方法。

使用.Net Core可以通过三种可行的方法来完成此任务:

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

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

    由于名称空间和类名称将与核心框架冲突,因此维护起来可能很烦人。

  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实例来实现。在本地主机上。

我希望这对在这种情况下找到自己的人有所帮助!