输出页面和会话页面状态

Output page and session page state

我想将 outputcache 添加到我的 ASP.NET 网站。但是,背后有一些代码会根据用户是否登录来更改某些按钮和内容。恐怕如果我使用它,它可能会缓存包含登录用户代码的页面。它是这样工作的,还是我是否必须配置一些东西才能与会话一起工作?

您需要进行以下更改:

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

<%@ 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);
}

根据您在下面对此回答的评论,您说您正在使用会话变量来检查用户是否登录。让我告诉你,这不是管理这样的身份验证的最佳实践。

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

<%@ 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);
}

这就是您需要做的全部。希望能帮助到你。