C# ASP.NET MVC中带身份验证的OutputCache困境

C# ASP.NET MVC中带身份验证的OutputCache困境,c#,asp.net,asp.net-mvc,caching,outputcache,C#,Asp.net,Asp.net Mvc,Caching,Outputcache,我正在编写一个ASP.NETMVC站点,其中包括用户创建帐户和登录的可能性。由于我也想积极缓存站点,我在混合缓存和身份验证时遇到了一些问题。 在每个页面的顶部,如果用户登录,我会输出他们的用户名、他们个人资料的链接和注销链接。如果他们没有登录,我会输出一个标准的登录链接。另外,在页面本身中,一些内容不会显示给未经身份验证的用户,而其他内容则取决于登录的用户 不久前,我第一次尝试解决这个问题,是询问堆栈溢出团队他们是如何解决这个问题的。Jeff回答说,他们基本上不为未经验证的用户进行缓存。因此,我

我正在编写一个ASP.NETMVC站点,其中包括用户创建帐户和登录的可能性。由于我也想积极缓存站点,我在混合缓存和身份验证时遇到了一些问题。

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

不久前,我第一次尝试解决这个问题,是询问堆栈溢出团队他们是如何解决这个问题的。Jeff回答说,他们基本上不为未经验证的用户进行缓存。因此,我编写了一个从OutputCacheAttribute派生的属性,但是如果用户登录,会取消缓存

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

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

  • HttpCacheability
    cachecontrol
    类型设置为
    private
    ,而不是
    public
    这样,响应只缓存在客户端。这能解决问题吗?如果是这样,这会影响缓存的效率吗?然而,我注意到堆栈溢出似乎使用了
    public
  • 设置VaryByCustom参数以对每个用户进行不同的缓存,如。在保持缓存的效率和有效性的同时,这会有所帮助吗

提前谢谢

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

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

还有一些方法可以使输出缓存与部分视图一起工作,但在我看来,它们增加了比实际需要更多的复杂性