如何防止asp.net MVC缓存一些部分,如登录用户名

时间:2014-01-05 23:31:03

标签: html asp.net asp.net-mvc-4 caching razor

我有以下操作方法,用于缓存服务器上的输出: -

[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);
        } 

但仍在缓存用户名。任何想法是什么问题?

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

正如您所指出的,如果用户没有高命中率并且不需要缓存用户特定数据,这可能是更好的选择。