我有一个ASP.NET网站,我使用OutPutCache指令实现了页面级缓存。这提高了页面性能。我的页面几乎没有特定于登录用户的部分(一些按钮,链接和标签)。如果用户没有登录,他们将看到不同的链接。现在我实现了页面级缓存,即使在用户登录后,它也显示旧页面内容(非登录用户的链接和按钮)。
缓存显然很好。但是如何摆脱这个问题呢?我需要完全删除缓存吗?
答案 0 :(得分:3)
你想要的是部分页面缓存: http://msdn.microsoft.com/en-us/library/ms227429.aspx和http://msdn.microsoft.com/en-us/library/h30h475z.aspx
答案 1 :(得分:2)
您可以使用VaryByParam指令:
VaryByParam:这个属性允许我们 控制多少缓存版本 应该基于创建页面 通过HTTP发送的名称/值对 POST / GET。默认值为None。 无意味着只有一个版本 该页面被添加到缓存中,并且 所有HTTP GET / POST参数都是 简单地忽略了相反的 没有价值是*。星号表示 传入的所有名称/值对 用于创建缓存 页面的版本。粒度 但是,可以通过命名来控制 参数(多个参数名称 用分号分开。
在页面指令
中使用<%@ OutputCache Duration="10800" VaryByParam="State;City" %>
请注意在VaryByParam中使用的内容,因为这会导致内存中页面的副本数达到存在的参数的不同值的数量。
编辑:如评论中所述,如果您使用cookie进行登录,这将无效,但有些人确实使用无cookie登录,这会将信息放入GET / POST部分。有关详细信息,请参阅here
答案 2 :(得分:2)
我遇到了完全相同的问题,并且能够使用Response.WriteSubstitution
解决它。只需创建一个接受HttpContext
作为参数的静态方法,将登录状态作为字符串返回,并使用WriteSubstitution
呈现方法:
Response.WriteSubstitution(new HttpResponseSubstitutionCallback(GetLoginStatus));
页面的其余部分将正常缓存,但每次加载页面时都会更新登录状态。