我正在写一个asp.net mvc网站,其中包括用户创建帐户和登录的可能性。由于我还想积极地缓存站点,所以我遇到了一些与缓存混合的问题。
在每个页面的顶部,如果用户已经登录,我会输出他们的用户名、指向他们的个人资料的链接和要注销的链接。如果他们没有登录,我会输出一个标准的登录链接。另外,在页面本身中,某些内容不会显示给未经验证的用户,而其他内容则取决于登录的用户。
一段时间前,我第一次尝试通过询问堆栈溢出团队是如何解决这个问题的。杰夫回答说,他们基本上根本不为未经验证的用户进行缓存。因此,我编写了一个从outputcacheattribute派生的属性,但如果用户登录,则取消缓存。
目前,我正在使用该属性,但在某些情况下得到的结果不正确。例如,用户可以访问某个页面,然后登录,然后再次访问该页面,只看到顶部的登录链接,而不是他们的用户名。
以下是我正在考虑的一些解决方案:
将HttpCacheability
或Cache-Control
类型设置为private
,而不是public
。这样,响应只在客户端缓存。这能解决问题吗?如果是,这会影响缓存的效率吗?不过,我注意到堆栈溢出似乎使用了public
。
为每个用户设置varybycustom参数以进行不同的缓存,如in this tutorial。这是否有助于在保持缓存效率和有效性的同时?
提前谢谢!
最佳答案
根据应用程序的结构,缓存数据而不是视图可能是有意义的。
由于视图非常简单,而且数据库访问通常需要渲染页面所需的大部分时间,因此您可以通过在控制器中缓存模型来获得输出缓存的大部分好处,并且视图中任何不可缓存的部分都不会受到影响,因此您可以缓存经过身份验证的用户查看的公共内容。
也有一些方法用部分视图来实现输出缓存,但在我看来,它们比真正合理的添加了更多的复杂性。