控制器上的输出缓存属性

本文关键字:缓存 属性 输出 控制器 | 更新日期: 2023-09-27 18:35:11

我有一个 ASP.NET MVC 4控制器,看起来像这样:

#if !DEBUG
    [OutputCache]
#endif
    public class LearningController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }
        public ActionResult Articles(string name)
        {
            ... return dynamic content here based on name
        }
    }

然后我有一个将"名称"映射到URL的RouteConfig,如下所示:

        routes.MapRoute(
            name: "Articles",
            url: "learning/articles/{name}",
            defaults: new { controller = "Learning", action = "Articles" }
        );

缓存似乎有效。当我在 .cshtml 文件中设置@DateTime.Now并使用 release 时,它确实在缓存。此外,每篇文章(按名称)也会正确返回动态内容。更重要的是,如果我恢复到查询字符串(完全删除 MapRoute),它仍然可以正常工作。

谁能向我解释为什么这在没有VaryByParam的情况下正常工作?我问是因为我担心动态操作没有正确缓存,或者当我进入生产环境时可能会开始提供不正确的内容。

控制器上的输出缓存属性

{name} 参数是 URI 的一部分,因为您将其添加到路由中,并且 OutputCache 始终独立缓存每个 URI。 VaryByParam只会影响HttpGet方法的查询字符串,例如 除非您定义了VaryByParam="name"(或*而不是name),否则/learning/articles?name=abc会缓存/learning/articles/)。