【问题标题】:OutputCache by user. Bug when I logout按用户输出缓存。注销时的错误
【发布时间】:2012-03-14 00:34:11
【问题描述】:

我做了一个 GetVaryByCustomString 返回:

context.User.Identity.IsAuthenticated.ToString();

但是我有一个大问题,想象一下这个流程:

  1. 用户(或任何人)访问主页。 GetVaryByCustomString 将返回“false”并缓存它。每次有人问首页是否有变化,都会返回304。

  2. 我在站点登录并转到主页,GetVaryByCustomString 返回“true”,然后不使用缓存。每次我访问主页时,ASP.NET 都会返回 304。

  3. 我注销并转到主页,现在 GetVaryByCustomString 由于第一步返回 304,但 OutputCache 不知道我拥有的缓存来自登录用户。

    李>

如果我按Ctrl+F5,它就可以工作,因为问题出在浏览器/服务器上,服务器端缓存是好的。但它返回 304,并且我缓存了一个记录页面。

有什么解决办法吗?还是我需要停止缓存经过身份验证的用户?

更新:我认为可变值的缓存不起作用。它需要浏览器也按此值缓存....并且不存在因 Cookie 而异...

【问题讨论】:

  • 就个人而言,我建议不要为经过身份验证的用户缓存(但仍为他们缓存静态资源)。这就是 Stack Overflow/Stack Exchange 的做法。
  • 我试图只在服务器上为 auth 用户缓存,但它似乎有一个错误,返回 304 + no-cache。现在我不为登录用户缓存,一切正常。

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


【解决方案1】:

我们最终所做的就是包括 SO 在内的大多数网站所做的:缓存页面,其中包含有关当前用户的零信息。

使用 AJAX,获取谁是当前用户并根据他们操作页面。

示例:成员个人资料上的关注/取消关注按钮。呈现缓存页面,不包含当前用户实施的逻辑。页面加载后,使用 AJAX 访问服务器,检查当前用户是否正在关注并相应地更改按钮状态。

【讨论】:

    【解决方案2】:

    作为一种解决方法,您可以跟踪用户已经注销,并为用户提供不同的输出。

    虽然您确实希望已注销的用户与从未登录的用户使用相同的页面,但您仍然可以使用相同的页面,但添加一些无论如何都会被浏览器忽略的空格。

    您可以通过 cookie 或会话变量来跟踪已注销的用户,但是如果在注销后您立即重定向到主页,那么您可以使用 MVC TempData 非常适合您,因为您需要仅在重定向期间,甚至在刷新页面之后(在经典 ASP.Net 中,您可以改用查询字符串)

    编辑:我刚刚意识到您直接基于身份验证系统,因此实施上述自定义的某些东西可能要困难得多,因此我会无视我的回答,尽管我仍然鼓励您检查您是否可以将查询字符串参数附加到您的网址。

    但是,如果我是正确的,您在 MVC 中,即使没有 getvartbycustomstring,操作方法上的 OutputCache 过滤器也应该与 Authorize 过滤器一起使用,并且这可能没有问题,但万一我错了您可以选择在 MVC 中编写自定义。

    此外,您可能会考虑这样一个事实,即 html.renderAction 默认情况下呈现的任何内容都不是缓存的一部分,您必须解决它,因此如果您的登录版本非常接近您的未登录版本,您可以尝试此解决方案登录版本。

    【讨论】:

    • 其实首页只是一个例子。我在所有页面都需要它。我认为当用户登录时我需要在服务器上缓存
    • 如果操作方法上的 OutputCache 过滤器是一个解决方案,那么您的问题应该完全解决
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-21
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    相关资源
    最近更新 更多