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