VaryByCustom - 向错误的用户显示数据

时间:2017-11-13 07:54:42

标签: c# asp.net-mvc caching

我在Intranet设置中使用Windows Auth来缓存从Active Directory中提取的信息。缓存的目的是加速页面,因为从AD读取不是特别快,并且不需要每次都完成。 (数据不会经常改变)

为此,我在HttpContext.Application中设置自定义键。

这是位于Global.asax中的代码,用于处理VaryByCustom:

public override string GetVaryByCustomString(HttpContext context, string arg)
        {
            System.Diagnostics.Debug.Print("GetVaryByCustomString : " + context.Application["BrowsingSession_Key"].ToString());
            if (arg == "BrowsingSession_Key")
            {
                object o = context.Application["BrowsingSession_Key"];
                if (o == null)
                {
                    o = Guid.NewGuid();
                    context.Application["BrowsingSession_Key"] = o;
                }
                return o.ToString();
            }
            return base.GetVaryByCustomString(context, arg);
        }

在我的BaseController中(由我的所有控制器继承):

protected override void Initialize(RequestContext requestContext)
        {
            base.Initialize(requestContext);
            //Custom Cache Initiation Variable
            if (HttpContext.Application["BrowsingSession_Key"] == null)
            {
                HttpContext.Application["BrowsingSession_Key"] = Guid.NewGuid();
                System.Diagnostics.Debug.Print("BaseController.Initialize : " + HttpContext.Application["BrowsingSession_Key"].ToString());
            }
        }

最后,在我控制器内部的方法中:

[OutputCache(Duration = 300, VaryByCustom = "BrowsingSession_Key", Location = OutputCacheLocation.Server)]
        public ActionResult Index(HomeViewModel model)
//...
        return View("index", model);
    }

问题很简单 - 第一个查看页面的人的信息被缓存,并且设置了Guid for BrowsingSession_Key。 但是,下一个用户在5分钟窗口内访问该页面,并到达最后一个用户缓存的内容。 正如您所看到的 - 我试图为每个用户提供一个独特的BrowsingSession_Key,以便他们获得自己的缓存内容。

我正在使用VaryByCustom,以便通过为该用户分配新的BrowsingSession_Key(Guid)来快速使缓存失效 - 并为他们提取页面的非缓存副本。

你能看到这里出了什么问题吗? 从我的测试 - 似乎通常调用Initialize,就像GetVaryByCustomString一样,在你期望它们被调用的地方。但是,我无法以多个用户身份运行调试,因此我无法理解为什么他们会获得相同的Guid和相同的输出缓存。

1 个答案:

答案 0 :(得分:0)

事实证明,即使是临时的,应用程序级变量也不是存储每个用户信息的好地方。

最后,我交换了使用带有存储GUID的cookie,并使cookie无效(重置GUID,或删除& Re-create)。这意味着多个用户可以使用该站点,而GetVaryByCustomString则处理存储在Cookie中的信息。

这适合我 - 但我需要考虑用户交换cookie的可能性,因此将进一步研究加密选项。 目前 - 答案是 - 不要以这种方式使用应用程序级变量,它们不适合这样的任务。