输出页面和会话页面状态

时间:2016-07-24 12:33:27

标签: c# asp.net caching webforms outputcache

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

1 个答案:

答案 0 :(得分:1)

您需要进行以下更改:

添加VaryByCustom属性,并在OutputCache指令中将其值设置为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);
}

这就是你需要做的一切。希望能帮助到你。