【问题标题】:ASP.NET Caching : Good As Well As Bad ! Page shows old content!ASP.NET 缓存:好与坏!页面显示旧内容!
【发布时间】:2010-04-05 21:57:54
【问题描述】:

我有一个 ASP.NET 网站,我在其中使用 OutPutCache 指令实现了页面级缓存。这提高了页面性能。我的页面只有少数特定于登录用户的部分(一些按钮、链接和标签)。如果用户未登录,他们将看到不同的链接。现在由于我实现了页面级缓存,即使在用户登录后,它仍显示旧页面内容(用于未登录用户的链接和按钮)。

缓存显然很好。但是如何摆脱这个问题呢?我需要完全删除缓存吗?

【问题讨论】:

  • 我想了解更多有关导航流程的信息。根据您的情况,您可以添加一个查询字符串参数来区分记录的请求和未记录的请求。一个 querystrign 参数足以避免不正确的缓存。

标签: asp.net performance caching


【解决方案1】:
【解决方案2】:

我遇到了完全相同的问题,并且能够使用 Response.WriteSubstitution 解决它。只需创建一个接受HttpContext 作为参数的静态方法,将登录状态作为字符串返回,然后使用WriteSubstitution 呈现该方法:

Response.WriteSubstitution(new HttpResponseSubstitutionCallback(GetLoginStatus));

页面的其余部分将正常缓存,但每次加载页面时都会更新登录状态。

【讨论】:

    【解决方案3】:

    您可以使用 VaryByParam 指令:

    VaryByParam:这个属性允许我们 控制有多少缓存版本 该页面应基于 通过 HTTP 发送的名称/值对 发布/获取。默认值为无。 None 意味着只有一个版本的 该页面被添加到缓存中,并且 所有 HTTP GET/POST 参数都是 简单地忽略了。与此相反 无值为 *。星号表示 所有传入的名称/值对 将用于创建缓存 页面的版本。粒度 但是,可以通过命名来控制 参数(多个参数名称 用分号分隔)。

    在页面指令中像这样使用

    <%@ OutputCache Duration="10800" VaryByParam="State;City" %>
    

    请注意您在 VaryByParam 中使用的内容,因为这会导致内存中页面的副本数达到您的参数存在的不同值的数量。

    编辑:如 cmets 中所述,如果您使用 cookie 登录,这将不起作用,但有些人确实使用无 cookie 登录,这会将信息放在 GET/POST 部分。

    详情请见here

    【讨论】:

    • +1,不是为了平衡反对票,而是因为它实际上值得赞成。 VaryByParam 将是我首先要解决的问题,答案中也提到了它的局限性。
    • 没有投反对票,但 VaryByParam 仅限于 GET/POST 值。如果用户通过 cookie 或会话值进行身份验证,VaryByParam 将不起作用。
    • 我还必须指出,因为 OP 提到每个用户不同 VaryByParam 将毫无意义,因为此参数将是每个用户,这将使缓存没有价值,除非差异仅是每个登录 vs未登录。
    猜你喜欢
    • 2011-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-15
    相关资源
    最近更新 更多