使用外部缓存提供程序的 ASP.NET MVC OutputCacheAttribute

在将 ASP.NET MVC 5应用程序切换到 Azure Redis (Microsoft.Web.RedisOutputCacheProvider Nuget 软件包)之后,我惊讶地发现,当设置为使用 OutputCacheLocation.AnyOutputCacheLocation.ServerAndClient时,OutputCacheAttribute也是如此

[Route("Views/Orders")]
[OutputCache(Duration = 600, Location = OutputCacheLocation.Any)]
public ActionResult Orders()
{
}

随机产生以下错误:

使用自定义输出缓存提供程序(如“ RedisOutputCache”)时, 只有以下过期策略和缓存特性 支持: 文件依赖,绝对过期,静态 验证回调和静态替换回调。

这很奇怪,因为上面的声明明确定义了没有 varybyparam这样的高级东西的绝对过期。经过一些搜索,它看起来像是没有修复到 这个问题这是非常令人沮丧的。有没有与 ASP.NET 缓存机制兼容的外部缓存提供程序?如果没有,那么如何在 MVC/WebApi 应用程序的集群场景中实现服务器端 HTTP 输出缓存?

1973 次浏览

问题是,如果端点经过了身份验证,那么根据定义,输出会因用户而异。因此,基本上所有外部输出缓存提供程序都不再是一个选项。

你的选择是:

  1. 如果端点允许匿名安全,则取消对端点的保护
  2. 使用可因用户而异的本地缓存
  3. 将端点拆分,以便使用子操作和/或对受保护数据的 AJAX 调用。这样可以使大多数内容公开,但保持实际数据不被缓存并受到保护
  4. 缓存在与输出不同的层上。你的应用服务器请求/响应和视图渲染真的是你的痛点吗?或者更有可能是 DB 和任何服务层计算?这些层中的缓存很容易,并且可以根据用户的需要轻松地改变。