James Sulak
James Sulak

Reputation: 32447

How can I remove the output cache on a per-user basis in ASP.NET MVC?

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

Answers (3)

Ehsan
Ehsan

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

ftnilsson
ftnilsson

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

dove
dove

Reputation: 20674

Why not have the user in the parameters and then it would be per-user through the VaryByParam.

Upvotes: 0

Related Questions