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:
Designing Evolvable Web APIs with ASP.NET
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:
public
class
MemoryCacher
|
{
public
object
GetValue(
string
key)
{
MemoryCache memoryCache = MemoryCache.Default;
return
memoryCache.Get(key);
}
public
bool
Add(
string
key,
object
value, DateTimeOffset absExpiration)
{
MemoryCache memoryCache = MemoryCache.Default;
return
memoryCache.Add(key, value, absExpiration);
}
public
void
Delete(
string
key)
{
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:
var
result = memCacher.GetValue(token);
|
NOTE: You should be aware that MemoryCache will be disposed every time IIS do app pool recycle.
If your Web API :
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:
var
result = memCacher.GetValue(token);
if
(result ==
null
)
{
// for example get token from database and put grabbed token
// again in memCacher Cache
}
|