OutputCache(按用户).注销时出现错误
本文关键字:错误 注销 用户 OutputCache | 更新日期: 2023-09-27 18:27:47
我做了一个GetVaryByCustomString,它返回:
context.User.Identity.IsAuthenticated.ToString();
但我有一个大问题,想象一下这个流程:
用户(或任何人)访问主页。GetVaryByCustomString将返回"false"并缓存该值。每次有人问主页是否更改,都会返回304。
我登录网站并转到主页,GetVaryByCustomString返回"true",然后不使用缓存。每次我转到主页时,ASP.NET都会返回304。
我注销并转到主页,现在GetVaryByCustomString返回304,因为第一步,但OutputCache不知道我拥有的缓存来自登录用户。
如果我按Ctrl+F5,它就工作了,因为问题出在浏览器/服务器上,服务器端的缓存还可以。但它返回304,我缓存了一个日志页面。
有什么解决方案吗?或者我需要停止缓存经过身份验证的用户吗?
更新:我认为可变值的缓存根本不起作用。它需要浏览器也按照这个值进行缓存。。。。并且不存在由Cookie引起的变化。。。
我们最终所做的是包括SO在内的大多数网站所做的:在页面上缓存关于当前用户的零信息。
使用AJAX,获取当前用户并根据他们操作页面。
示例:成员配置文件上的关注/取消关注按钮。呈现缓存的页面时不使用当前用户实现的逻辑。页面加载后,使用AJAX访问服务器,检查当前用户是否在关注,并相应地更改按钮状态。
作为一种变通方法,您可以跟踪用户是否已经注销,并为用户提供不同的输出。
虽然您确实希望注销的用户与从未登录过的用户使用相同的页面,但您仍然可以使用相同的网页,但添加一些空白,这些空白无论如何都会被浏览器忽略。
您可以通过cookie或会话变量来跟踪已注销的用户,但是,如果注销后您立即重定向到主页,那么您可以使用MVC TempData,这非常适合,因为您只需要在重定向过程中,甚至在刷新页面后(在经典的ASP.Net中,您可以使用查询字符串)
编辑:我刚刚意识到,您直接基于身份验证系统,因此可能更难实现像上面这样的自定义功能,因此我将忽略我的回答,尽管我仍然鼓励您检查是否可以在URL中附加查询字符串参数。
然而,正如你在MVC中所做的那样,如果我是正确的,那么操作方法上的OutputCache过滤器应该与Authorize过滤器一起工作,即使没有getvartbycustomstring,这也可能没有问题,但如果我错了,你可以在MVC中选择写一个自定义过滤器。
此外,您可能会考虑到,默认情况下,由html.renderAction呈现的任何内容都不属于缓存的一部分,您必须解决此问题,因此,如果您的登录版本与未登录版本非常接近,则可以尝试此解决方案。