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

时间:2011-01-16 21:24:50

标签: c# asp.net asp.net-mvc caching outputcache

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

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

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

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

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

  • HttpCacheabilityCache-Control类型设置为private,而不是public这样,响应仅缓存在客户端。这会解决这个问题吗?如果是这样,这会对缓存效率产生影响吗?我注意到Stack Overflow似乎使用了public
  • 设置VaryByCustom参数以针对每个用户进行不同的缓存,例如in this tutorial。这会有所帮助,同时仍能保持缓存的效率和效果吗?

提前致谢!

1 个答案:

答案 0 :(得分:9)

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

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

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