How to use caching in ASP.NET Web API?

C#asp.net Web-ApiHttp Caching

C# Problem Overview


I am using ASP.NET MVC 4 with WEB API

I have the following action, in the action shown below, my service method makes a db call to DoMagic() method and returns an integer value which I am then using on every page, this action is called using an ajax call.

Below is my WEB API action :

[OutputCache(Duration = 86400, VaryByParam = "none")]
[ActionName("GetMyMagicNumber")]
public int GetMyMagicNumber()
{
    if (WebSecurity.IsAuthenticated)
    {
        var revenue = _magicService.DoMagic();
        return revenue;
    }
    return 0;
}

My question : I haved tried using [OutputCache(Duration = 86400, VaryByParam = "none")] and I excepted that only the first time the db call will be made and next subsequent request to this action will return me the cached value, but this is not happening.

A db call is again made, the db call takes time how do I get this working ?

C# Solutions


Solution 1 - C#

Unfortunately, caching is not built into ASP.NET Web API.

Check this out to get you on track: http://www.strathweb.com/2012/05/output-caching-in-asp-net-web-api/

An updated resource here: https://github.com/filipw/AspNetWebApi-OutputCache

EDIT: As of 2020-02-03, even though this answer is quite old, it's still valid.

Both of the URL's above lead to the same project, ASP.NET Web API CacheOutput by Filip W

Solution 2 - C#

Add a reference to System.Runtime.Caching in your project. Add a helper class :

using System;
using System.Runtime.Caching;


public static class MemoryCacher
{
    public static object GetValue(string key)
    {
        MemoryCache memoryCache = MemoryCache.Default;
        return memoryCache.Get(key);
    }

    public static bool Add(string key, object value, DateTimeOffset absExpiration)
    {
        MemoryCache memoryCache = MemoryCache.Default;
        return memoryCache.Add(key, value, absExpiration);
    }

    public static  void Delete(string key)
    {
        MemoryCache memoryCache = MemoryCache.Default;
        if (memoryCache.Contains(key))
        {
            memoryCache.Remove(key);
        }
    }
}

Then from your code get or set objects in the cache :

list = (List <ChapterEx>)MemoryCacher.GetValue("CacheItem1");

and

MemoryCacher.Add("CacheItem1", list, DateTimeOffset.UtcNow.AddYears(1));

Solution 3 - C#

As already mentioned by OakNinja, output caching via [OutputCache] attributes is currently not supported by the ASP.NET Web API.

However, there are a few open source implementations filling the gap:

Strathweb.CacheOutput

A small library bringing caching options, similar to MVC's "OutputCacheAttribute", to Web API actions.

Github: https://github.com/filipw/Strathweb.CacheOutput<br> License: Apache v2

CacheCow

An implementation of HTTP Caching in ASP.NET Web API for both client-side and server-side.

Github: https://github.com/aliostad/CacheCow<br> License: MIT

There is a nice blog post by Scott Hanselmann covering both feature sets.

Solution 4 - C#

[ResponseCache] is now supported in ASP.NET Core

Features may look identical to [OutputCache] but [ResponseCache] is only for the client side.

> Response caching adds cache-related headers to responses. These headers specify how you want client, proxy and middleware to cache responses.

https://docs.microsoft.com/en-us/aspnet/core/performance/caching/response

[ResponseCache(Duration = 3600)]
[HttpGet]
public IEnumerable<Product> Get()
{
  return _service.GetAll();
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionYasser ShaikhView Question on Stackoverflow
Solution 1 - C#OakNinjaView Answer on Stackoverflow
Solution 2 - C#SagiView Answer on Stackoverflow
Solution 3 - C#CodeZombieView Answer on Stackoverflow
Solution 4 - C#wonsterView Answer on Stackoverflow