如何在ASP.NET MVC中基于每个用户删除输出缓存?

时间:2011-03-03 20:44:41

标签: c# asp.net-mvc caching asp.net-mvc-3

我正在使用VaryByCustom在每个浏览器和每个用户的基础上创建输出缓存:

[OutputCache(Duration = 6000, VaryByParam = "*", VaryByCustom="browser;userName")]

(我已覆盖GetVaryByCustomString()以使其发挥作用。)

我需要能够删除单个用户的输出缓存,如果可能的话,不会使不同用户的输出缓存失效。我已经阅读了HttpResponse.RemoveOutputCacheItem(),但这可以通过删除基于路径的输出缓存来实现。有没有办法根据VaryByCustom字符串执行此操作?

3 个答案:

答案 0 :(得分:1)

您可以通过覆盖VaryByCustom[OutputCache]

来充分利用HttpApplication.GetVaryByCustomStringHttpContext.Current.User.IsAuthenticated.属性的优势

这是我将在Global.asax.cs文件中创建的内容:

public override string GetVaryByCustomString(HttpContext context, string custom)
    {
        if (custom == "UserName")
        {
            if (context.Request.IsAuthenticated)
            {
                return context.User.Identity.Name;
            }
            return null;
        }

        return base.GetVaryByCustomString(context, custom);
    }

然后在OutputCache属性中使用它:

[OutputCache(Duration = 10, VaryByParam = "none", VaryByCustom = "UserName")]
public ActionResult Profiles()
{
    //...
}

但请注意,在这种情况下,用户名应该是不可变的!

答案 1 :(得分:0)

为什么不让用户参与参数,然后通过VaryByParam为每个用户。

答案 2 :(得分:0)

也许使用

Response.Cache.SetVaryByCustom(string custom);

在ActionFilter中,您可以构建包含浏览器版本和用户

的字符串