ASP.NET MVC中的身份验证与OutputCache的困境

8
我正在编写一个ASP.NET MVC网站,其中包括用户创建账户和登录的可能性。由于我还想积极缓存该网站,因此在缓存和身份验证混合时遇到了一些麻烦。
在每个页面的顶部,如果用户已登录,则输出其用户名、到其个人资料的链接和注销链接。如果他们没有登录,则输出标准的登录链接。此外,在页面本身中,某些内容不会显示给未经身份验证的用户,而其他内容取决于哪个用户已登录。
我最初尝试通过询问Stack Overflow团队如何解决问题来解决这个问题。Jeff回答说,他们基本上不为未经身份验证的用户进行任何缓存。因此,我编写了一个从OutputCacheAttribute派生但在用户登录时取消缓存的属性。
目前,我正在使用该属性,但在某些情况下,我会得到错误的结果。例如,用户可以访问某些页面,然后登录,然后再次访问该页面,只能看到顶部的登录链接,而不是他们的用户名。
以下是我考虑的一些解决方案:
  • HttpCacheabilityCache-Control类型设置为private而不是public这样,响应仅在客户端缓存。这样做能解决问题吗?如果可以,这对缓存的效率会有影响吗?我注意到Stack Overflow似乎使用public
  • 设置一个VaryByCustom参数,针对每个用户进行不同的缓存,例如在本教程中。这样做是否有帮助,同时又保持了缓存的效率和有效性?

提前感谢!

1个回答

9
根据应用程序的结构,缓存数据而不是视图可能是有意义的。由于视图非常简单,数据库访问通常需要渲染页面所需时间的大部分,因此通过在控制器中缓存模型,您可以获得大部分输出缓存的好处,并且任何不可缓存的视图部分都不会受到影响,因此您可以缓存被已认证用户查看的公共内容。还有一些方法可以使输出缓存与局部视图配合使用,但我认为它们增加了更多不必要的复杂性。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接