我有以下操作方法,用于缓存服务器上的输出: -
[CheckUserPermissions(Action = "", Model = "Admin")]
[OutputCache(CacheProfile = "short", Location = OutputCacheLocation.Server, VaryByHeader = "X-Requested-With")]
public ActionResult SystemInfo(int page = 1,bool forTechAudit=false)
{
在我的_layout共享视图中,我显示当前登录的用户如下: -
<span class="username customTopNavText " style=" display:block; "><i class="icon-user"></i><strong > @User.Identity.Name.Substring(User.Identity.Name.IndexOf("\\") + 1)</strong></span>
但我面临的问题是,当userA访问action方法时,他的用户名将被缓存为返回视图的一部分。当userB访问缓存数据时,userA用户名将显示在userB浏览器上。那么有没有办法防止在我的_layout共享视图中缓存用户名? 感谢
修改
我已经从nuget安装了DonutCachint,然后我将以下内容添加到布局视图Html.Action("getuser","Home",true)
。我定义了以下行动方法: -
public string getuser()
{
return User.Identity.Name.Substring(User.Identity.Name.IndexOf("\\") + 1);
}
但仍在缓存用户名。任何想法是什么问题?
答案 0 :(得分:2)
如果您不想更改页面结构,可以传递包含用户标识的参数,并使用VaryByParam属性。
[的OutputCache(的VaryByParam =&#34;用户ID&#34)]
或者,您可以创建自己的VaryByCustom实现,并以一些服务器方式查找用户。摘自here
[的OutputCache(VaryByCustom是=&#34;用户名&#34)]
public override string GetVaryByCustomString(HttpContext context, string arg)
{
if (arg == "userName")
{
return context.User.Identity.Name;
}
return string.Empty;
}
有一些不同的技术称为甜甜圈缓存,而您缓存外部页面布局而不是页面的一些内部部分内容(圆环孔)。这里的故事变得更复杂,但你可以进一步阅读here。
正如您所指出的,如果用户没有高命中率并且不需要缓存用户特定数据,这可能是更好的选择。