ASP.NET Web API で簡単なキャッシュの仕組みが必要になったので、MemoryCache を使ってみた。

参照設定より System.Runtime.Caching を追加しておく。

コントローラーでの使い方は以下のようになる。
ここではある値を3秒間キャッシュし、キャッシュに存在する間はその値を返し続ける。
キャッシュが破棄されるときは、UpdateCallback で設定したデレゲートが呼び出されるので、いつ破棄されたかが分かる。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Runtime.Caching;
using System.Web.Http;

namespace MvcApplication1.Controllers
{
	public class ValuesController : ApiController
	{
		public IEnumerable Get()
		{
			var cache = MemoryCache.Default;
			if (cache["key1"] != null)
			{
				return new string[] { (string)cache["key1"] };
			}

			var now = DateTime.Now;
			var policy = new CacheItemPolicy();
			policy.Priority = CacheItemPriority.Default;
			policy.AbsoluteExpiration = now.AddSeconds(3);
			policy.UpdateCallback = new CacheEntryUpdateCallback(MyCachedItemUpdateCallback);

			var key = "key1";
			var value = "value1(" + now.ToString() + ")";
			System.Diagnostics.Trace.WriteLine(string.Format("{0} add. {1}:{2}", now, key, value));
			cache.Set(key, value, policy);

			return new string[] { (string)cache["key1"] };
		}

		private static void MyCachedItemUpdateCallback(CacheEntryUpdateArguments arguments)
		{
			var now = DateTime.Now;
			var reason = arguments.RemovedReason.ToString();
			var key = arguments.Key;
			var value = arguments.Source[arguments.Key].ToString();
			System.Diagnostics.Trace.WriteLine(string.Format("{0} remove({1}). {2}:{3}", now, reason, key, value));
		}
	}
}

実行してみると、以下のようになった。
どうも破棄されるタイミングは毎分00秒、20秒、40秒のいずれかとなっているようだ。そのため、キャッシュ時間を3秒と設定しても、最大で20秒キャッシュされてしまう。
2016/03/01 15:11:15 add. key1:value1(2016/03/01 15:11:15)
2016/03/01 15:11:20 remove(Expired). key1:value1(2016/03/01 15:11:15)

2016/03/01 15:11:36 add. key1:value1(2016/03/01 15:11:36)
2016/03/01 15:11:40 remove(Expired). key1:value1(2016/03/01 15:11:36)

2016/03/01 15:11:50 add. key1:value1(2016/03/01 15:11:50)
2016/03/01 15:12:00 remove(Expired). key1:value1(2016/03/01 15:11:50)

2016/03/01 15:13:20 add. key1:value1(2016/03/01 15:13:20)
2016/03/01 15:13:40 remove(Expired). key1:value1(2016/03/01 15:13:20)

以上です。