WCF サービスで .Net 4.0 MemoryCache を使用しています。私はもともと以下のようにデフォルトキャッシュを使用していました:
var cache = MemoryCache.Default;
次に、キャッシュ内で何かを見つけようとして取得し、見つからない場合はキャッシュに設定するという通常のパターンを実行します (コード スニペット / 以下の疑似コード)。
var geoCoordinate = cache.Get(cacheKey) as GeoCoordinate;
if (geoCoordinate == null)
{
geoCoordinate = get it from somewhere;
cache.Set(cacheKey, geoCoordinate, DateTimeOffset.Now.AddDays(7));
}
エントリが約 1 時間後に消えていることに気付きました。2分。私のコードが不足しているエントリをキャッシュに戻したとしても、後続のキャッシュ Get は null を返します。私の WCF サービスは IIS 7.5 によってホストされています。アプリ プールをリサイクルすると、すべてが 2 分間正常に機能しますが、その後、上記のパターンが繰り返されます。
いくつかの調査を行った後、次のように置き換えました。 var cache = MemoryCache.Default;
// 以下のようにキャッシュを作成する新しいコード:
var config = new NameValueCollection();
//Hack: Set Polling interval to 10 days, so will no clear cache.
config.Add("pollingInterval", "10:00:00:00");
config.Add("physicalMemoryLimitPercentage", "90");
config.Add("cacheMemoryLimitMegabytes", "2000");
//instantiate cache
var cache = new MemoryCache("GeneralCache", config);
何を入れてもphysicalMemoryLimitPercentage
、cacheMemoryLimitMegabytes
役に立たないようです。しかしpollingInterval
、大きなものを配置することはdatespan
できません。
すなわち: 以下のように設定した場合: config.Add("pollingInterval", "00:00:15:00"); その後、すべてが 15 分間正常に動作します。
注: WCF サービスが開発環境で IISExpress によってホストされている場合、再現できません。これは、私の WCF サービスが IIS 7.5 によってホストされている場合にも発生するようです。IIS 7.5 のアプリ プールがリサイクルされません。
誰もこのようなことを経験しましたか? 私は以下を見てきました: MemoryCache は構成のメモリ制限に従いません
ありがとう、
マット