Simple way to implement caching in ASP.NET Web API

来源:互联网 发布:360软件管家界面太大 编辑:程序博客网 时间:2024/05/16 11:36

http://stackoverflow.com/questions/18937545/caching-application-data-in-memory-mvc-web-api


另附:WebCache Class https://msdn.microsoft.com/en-us/library/system.web.helpers.webcache(v=vs.111).aspx

原文:http://blog.developers.ba/simple-way-implement-caching-asp-net-web-api/

This article is not about caching the output of APIControllers.
Often in ASP.NET Web API you will have a need to cache something temporarily in memory probably to improve performance.

There are several nice libraries that allow you to do just that.

One very popular is CacheCow and here you will find a very nice article how to use this library.

But what if you want to do caching without third party library in a very simple way?
 
If you want to learn more about ASP.NET Web API I recommend a great book that I love written by real experts:
 
BookWebAPIEvolvable
Designing Evolvable Web APIs with ASP.NET 

Caching without third party library in a very simple way

I had a need for this. I implemented some basic authentication for the ASP.NET Web API with Tokens and wanted to cache Tokens temporarily in memory to avoid going into the database for every HTTP request.

The solution is very simple.
You just need to use Microsoft class for this called MemoryCache which resides inSystem.Runtime.Caching dll.

 

I created a simple helper class for caching with few lines of code:

 

publicclassMemoryCacher
{
  publicobjectGetValue(stringkey)
  {
    MemoryCache memoryCache = MemoryCache.Default;
    returnmemoryCache.Get(key);
  }
 
  publicboolAdd(stringkey,objectvalue, DateTimeOffset absExpiration)
  {
    MemoryCache memoryCache = MemoryCache.Default;
    returnmemoryCache.Add(key, value, absExpiration);
  }
 
  publicvoidDelete(stringkey)
  {
    MemoryCache memoryCache = MemoryCache.Default;
    if(memoryCache.Contains(key))
    {
       memoryCache.Remove(key);
    }
  }
}

When you want to cache something:

memCacher.Add(token, userId, DateTimeOffset.UtcNow.AddHours(1));

 

And to get something from the cache:

varresult = memCacher.GetValue(token);

 
 
 
NOTE: You should be aware that MemoryCache will be disposed every time IIS do app pool recycle.

If your Web API :

  • Does not receive any request for more that 20 minutes
  • Or hit default IIS pool interval 1740 minutes
  • Or you copy a new version of your ASP.NET Web API project into an IIS folder (this will auto-trigger app pool recycle)

So you should have a workaround for this. If you don’t get value from the cache you should grab it for example from a database and then store it again in the cache:

 

varresult = memCacher.GetValue(token);
if(result == null)
{
    // for example get token from database and put grabbed token
    // again in memCacher Cache
}

0 0