eka808
eka808

Reputation: 2317

ASP.NET MVC 3 caching or not caching action strategy

I have an action, let's say /Foo/Bar with a GET parameter in this action, get_cached, who define if we want to get the cached value or the "realtime".

This is made with the following code :

public ActionResult Bar()
{
    var useCache = Request.Params["get_cached"] == "1" ? true : false;

    if (useCache)
    {
        return RedirectToAction("BarCached");
    }
    else
    {
        return RedirectToAction("BarRealTime");
    }
}

[OutputCache(Duration = 100, VaryByParam = "*")]
public ActionResult BarCached()
{
    return Content("mystuff_cached");
}
public ActionResult BarRealTime()
{
    return Content("mystuff_realtime");
}

No problem with this code, apart the url will be shown as BarCached or BarRealTime and i would get only Bar (the main action name).

I tried to change the RedirectToAction to the full method name like this :

return this.BarCached()

But this disable the cache capabilities !

So, how can render the ActionResult code from a method (render BarCached from Bar) using the OutputCache definitions on this method (OutputCache on BarCached) ?

Thanks by advance.

Upvotes: 0

Views: 553

Answers (2)

eka808
eka808

Reputation: 2317

I ended using the System.Web.Caching namespace who is the base cache handler of asp.net MVC. I can access the cache repository of Asp.NET MVC with System.Web.HttpContext.Current.Cache

Using that, I store the ActionResult of "BarCached" and then I can get the cache feature the way I want using something like this :

Add a value to the cache

System.Web.HttpContext.Current.Cache.Insert(
                    "mykey",
                    "myvalue",
                    null,
                    DateTime.Now.AddSeconds(expirationInSeconds),
                    System.Web.Caching.Cache.NoSlidingExpiration
                );

And get value from the cache

var myvalue = System.Web.HttpContext.Current.Cache.Get("mykey")

Upvotes: 0

Joe
Joe

Reputation: 5497

In the asp.net pipeline, ResolveRequestCache (which OutputCache relies on) occurs just after the request is authenticated. In your example above, by the time you have gotten to "Bar" it's too late to use output caching, as you have noted by saying that this.BarCached() doesn't recognize the cache attribute.

If your problem is the performance of whatever generates "mystuff_", could you not just save the result of that call to the application cache and return it in your Bar() method instead of the RedirectToAction objects?

Not much of a solution I know, but hopefully helpful just the same.

Upvotes: 1

Related Questions