带有外部缓存提供程序的 ASP.NET MVC OutputCacheAttribute

Posted

技术标签:

【中文标题】带有外部缓存提供程序的 ASP.NET MVC OutputCacheAttribute【英文标题】:ASP.NET MVC OutputCacheAttribute with external cache providers 【发布时间】:2017-03-29 07:58:47 【问题描述】:

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

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


随机产生如下错误:

当使用像“RedisOutputCache”这样的自定义输出缓存提供程序时, 只有以下过期策略和缓存功能 支持:文件依赖、绝对过期、静态 验证回调和静态替换回调。

这很奇怪,因为上面的声明清楚地定义了绝对过期,没有像varybyparam 这样的高级东西。经过一番搜索,this issue 似乎没有修复,这非常令人沮丧。是否有任何与 ASP.NET 缓存机制兼容的外部缓存提供程序?如果没有,如何在 MVC/WebApi 应用的集群场景中实现服务器端 HTTP 输出缓存?

【问题讨论】:

您可以尝试将您的集群放置在反向代理之后,例如 nginx。您可能会发现它提供了更好的性能,因为您可以卸载 TLS 并在本机(而不是 .net)中运行缓存。 这很有趣,谢谢!我可以选择以某种方式以编程方式使 nginx 缓存无效吗? 其实你做的正好相反。查找 304 Not Modified 和 ETag。 如果使用 Redis 缓存,为什么需要指定位置?这对我来说似乎是多余的。您还可以详细说明“随机”吗?同样的动作有时有错误有时没有?有些动作一直都有,有些却没有? RedisOutputCacheProvider 似乎是一个开源项目——您可以拉取该项目,将其与您的项目集成,以便在调试时获得该问题的更多上下文:github.com/Azure/aspnet-redis-providers/blob/master/src/… 【参考方案1】:

问题在于,如果端点经过身份验证,那么根据定义,输出会因用户而异。所以基本上所有的外部输出缓存提供者都不再是一种选择了。

您的选择是:

    如果端点可以安全地允许匿名,则取消对端点的保护 使用因用户而异的本地缓存 拆分您的端点,以便您使用子操作和/或 AJAX 调用来获取受保护的数据。这可以让您公开大部分内容,但不缓存和保护实际数据 缓存在与输出不同的层。您的应用服务器请求/响应和视图渲染真的是您的规模痛点吗?还是更有可能是数据库和任何服务层计算?在这些层中缓存很容易,并且可以根据需要轻松地因用户而异。

【讨论】:

以上是关于带有外部缓存提供程序的 ASP.NET MVC OutputCacheAttribute的主要内容,如果未能解决你的问题,请参考以下文章

带有通用提供程序的 ASP.NET MVC 4 中的错误

实体框架探查器 - 带有 EF 6 的 ASP.NET MVC4 - 无法确定提供程序名称

带有大型数据源的 Kendo Chart 的 Ajax 请求上的 ASP.NET MVC 应用程序?

ASP.NET MVC

带有 ASP.NET MVC 和 AJAX 的分页表 [关闭]

过期输出缓存 ASP.Net MVC