Reputation: 32447
I'm using VaryByCustom
to create an output cache on a per-browser and per-user basis:
[OutputCache(Duration = 6000, VaryByParam = "*", VaryByCustom="browser;userName")]
(I've overridden GetVaryByCustomString()
to make this work.)
I need to be able to remove a single user's output cache, without invalidating the output cache of different users, if possible. I've read about HttpResponse.RemoveOutputCacheItem()
, but that works by removing the output cache based on path. Is there any way to do this based on the VaryByCustom string?
Upvotes: 5
Views: 1826
Reputation: 834
You can take the advantage of VaryByCustom
property in [OutputCache]
by overriding HttpApplication.GetVaryByCustomString
and check HttpContext.Current.User.IsAuthenticated.
This is what I will create in Global.asax.cs file:
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);
}
And then use it in OutputCache attribute:
[OutputCache(Duration = 10, VaryByParam = "none", VaryByCustom = "UserName")]
public ActionResult Profiles()
{
//...
}
but be careful that the username should be immutable in this case!
Upvotes: 1
Reputation: 2193
perhaps use
Response.Cache.SetVaryByCustom(string custom);
in an ActionFilter the you can build up the string including browser version and user
Upvotes: 0
Reputation: 20674
Why not have the user in the parameters and then it would be per-user through the VaryByParam.
Upvotes: 0