我在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和相同的输出缓存。
答案 0 :(得分:0)
事实证明,即使是临时的,应用程序级变量也不是存储每个用户信息的好地方。
最后,我交换了使用带有存储GUID的cookie,并使cookie无效(重置GUID,或删除& Re-create)。这意味着多个用户可以使用该站点,而GetVaryByCustomString则处理存储在Cookie中的信息。
这适合我 - 但我需要考虑用户交换cookie的可能性,因此将进一步研究加密选项。 目前 - 答案是 - 不要以这种方式使用应用程序级变量,它们不适合这样的任务。