输出页面和会话页面状态

本文关键字:状态 会话 输出 | 更新日期: 2023-09-27 17:58:20

我想将outputcache添加到我的ASP.NET网站。但是,有一些代码会根据用户是否登录来更改一些按钮和内容。我担心如果我使用它,它可能会缓存带有登录用户代码的页面。这是它的工作方式吗?或者我是否必须配置一些东西,以便它能与会话一起工作?

输出页面和会话页面状态

您需要进行以下更改:

OutputCache指令中添加VaryByCustom属性并将其值设置为User,如下所示:

<%@ OutputCache VaryByCustom="User" .... %>

然后,在Global.asax文件中,您需要覆盖GetVaryByCustomString方法,如下所示:

public override string GetVaryByCustomString(HttpContext context, string custom)
{
    if (custom.Equals("User", StringComparison.InvariantCultureIgnoreCase))
    {
        // Return the user name/login as a value that will invalidate cache per authenticated user. 
        return context.User.Identity.Name;
    }
    return base.GetVaryByCustomString(context, custom);
}

根据您在下面对这个anwser的评论,您说您正在使用Session变量来检查用户是否登录。让我告诉您,这不是管理这样的身份验证的最佳做法。

通过任何方式,根据会话值使缓存无效的解决方案都是这样做的:

<%@ OutputCache VaryByCustom="Session" .... %>

同样,VaryByCustom可以是你想要的任何string值,给它一个string真的很好的含义,让未来的开发人员或你知道你在做什么。

然后覆盖

public override string GetVaryByCustomString(HttpContext context, string custom)
{
    if (custom.Equals("Session", StringComparison.InvariantCultureIgnoreCase))
    {
        // make sure that the session value is convertible to string
        return (string)context.Session["Here you put your session Id"];
    }
    return base.GetVaryByCustomString(context, custom);
}

这就是你所需要做的。希望能有所帮助。