每个用户和匿名访客的 MVC 5 主页输出缓存
MVC 5 Homepage Output cache per User and Anonymous Guests
作为 DonutCache 的替代品,有没有人发现以下输出缓存方法有任何问题。它似乎在不暴露任何用户数据的情况下工作,并根据时间戳测试为每个人正确缓存页面,这是我最关心的。在我的实时网站上实施之前,我只想介绍一下我的基础。
在Glogal.asax.cs
public override string GetVaryByCustomString(HttpContext context, string arg)
{
if (arg == "User")
{
if (context.User.Identity.Name != "")
{
return "User=" + context.User.Identity.Name;
}
else
{
return "User=Guest";
}
}
return base.GetVaryByCustomString(context, arg);
}
在Web.config
<caching>
<outputCacheSettings>
<outputCacheProfiles>
<add name="HomePage" duration="86400" varyByParam="*" varyByCustom="User" location="Server" />
</outputCacheProfiles>
</outputCacheSettings>
</caching>
*n 控制器
[OutputCache(CacheProfile = "HomePage")]
public ActionResult Index()
{
return View();
}
参考方案:Output cache per User
您的方法依赖于用户名(通常映射到他们的名字)对所有用户都是唯一的,并且没有实际用户有名字 "Guest"。
更好的方法是将其映射到该用户的应用程序内部 ID。
if (arg == "User")
{
if (context.User.Identity.IsAuthenticated)
{
return $"User={context.User.Identity.GetUserId()}";
}
else
{
return $"User={int.MinValue}";
}
}
作为 DonutCache 的替代品,有没有人发现以下输出缓存方法有任何问题。它似乎在不暴露任何用户数据的情况下工作,并根据时间戳测试为每个人正确缓存页面,这是我最关心的。在我的实时网站上实施之前,我只想介绍一下我的基础。
在Glogal.asax.cs
public override string GetVaryByCustomString(HttpContext context, string arg)
{
if (arg == "User")
{
if (context.User.Identity.Name != "")
{
return "User=" + context.User.Identity.Name;
}
else
{
return "User=Guest";
}
}
return base.GetVaryByCustomString(context, arg);
}
在Web.config
<caching>
<outputCacheSettings>
<outputCacheProfiles>
<add name="HomePage" duration="86400" varyByParam="*" varyByCustom="User" location="Server" />
</outputCacheProfiles>
</outputCacheSettings>
</caching>
*n 控制器
[OutputCache(CacheProfile = "HomePage")]
public ActionResult Index()
{
return View();
}
参考方案:Output cache per User
您的方法依赖于用户名(通常映射到他们的名字)对所有用户都是唯一的,并且没有实际用户有名字 "Guest"。
更好的方法是将其映射到该用户的应用程序内部 ID。
if (arg == "User")
{
if (context.User.Identity.IsAuthenticated)
{
return $"User={context.User.Identity.GetUserId()}";
}
else
{
return $"User={int.MinValue}";
}
}