控制器上的 OutputCache 属性

OutputCache attribute on a controller

我有一个 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
        }
    }

然后我有一个将 "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 方法的查询字符串,例如/learning/articles?name=abc 将缓存 /learning/articles/,除非您定义了 VaryByParam="name"(或 * 而不是 name)。