在ASP.NET MVC中使用身份验证的OutputCache困境

Max*_*sky 8 c# asp.net asp.net-mvc caching outputcache

我正在编写一个ASP.NET MVC站点,其中包括用户创建帐户和登录的可能性.由于我还想积极地缓存该站点,我在将缓存与身份验证混合时遇到了一些麻烦.

在每个页面的顶部,如果用户已登录,我会输出其用户名,指向其个人资料的链接以及注销链接.如果他们没有登录,我输出一个标准的登录链接.此外,在页面本身中,某些内容不会显示给未经身份验证的用户,而其他内容则取决于登录的用户.

我前一次尝试通过询问Stack Overflow团队如何解决问题来解决这个问题.杰夫回答说,对于未经身份验证的用户,他们基本上根本没有缓存.因此,我编写了一个派生自OutputCacheAttribute的属性,但如果用户已登录则取消缓存.

目前,我正在使用该属性,但在某些情况下我得到的结果不正确.例如,用户可以访问某个页面,然后登录,然后再次访问该页面,只能看到顶部的登录链接,而不是他们的用户名.

以下是我正在考虑的一些解决方案:

  • 设置HttpCacheabilityCache-Control键入private,而不是public.这样,响应仅缓存在客户端.这会解决这个问题吗?如果是这样,这会对缓存效率产生影响吗?但是,我注意到Stack Overflow似乎正在使用public.
  • 设置VaryByCustom参数以针对每个用户进行不同的缓存,如本教程中所述.这会有帮助吗,同时仍然保持缓存的效率和效果?

提前致谢!

Tom*_*son 9

根据应用程序的结构,缓存数据而不是视图可能有意义.

由于视图非常简单,并且数据库访问通常占用呈现页面所需的大部分时间,因此您可以通过在控制器中缓存模型来获得输出缓存的大部分好处,并且视图的任何无法访问的部分都不会受到影响,因此您可以缓存经过身份验证的用户正在查看的公共内容

还有一些方法可以使输出缓存与部分视图一起工作,但在我看来,它们增加了比真正合理的复杂性.