2

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);

何を入れてもphysicalMemoryLimitPercentagecacheMemoryLimitMegabytes役に立たないようです。しかしpollingInterval、大きなものを配置することはdatespanできません。

すなわち: 以下のように設定した場合: config.Add("pollingInterval", "00:00:15:00"); その後、すべてが 15 分間正常に動作します。

注: WCF サービスが開発環境で IISExpress によってホストされている場合、再現できません。これは、私の WCF サービスが IIS 7.5 によってホストされている場合にも発生するようです。IIS 7.5 のアプリ プールがリサイクルされません。

誰もこのようなことを経験しましたか? 私は以下を見てきました: MemoryCache は構成のメモリ制限に従いません

ありがとう、

マット

4

1 に答える 1

1

私もこの問題を見て、簡単な再現プロジェクトでMSにバグを報告しました。

これは、私が提出した上記のバグでMSによって解決されました-回避策と.net 4の今後のQFE、およびこれが4.5では問題ではないことの確認私はまだ回避策を試していません

ただし、これを再現するために自分で必要な条件について、もう少し情報を提供することができます。この問題を確認するには、アプリケーションプールを統合パイプラインモードにする必要がありました。クラシックモードではこの問題は修正されますが、IIS7.5に移行するメリットの一部は失われます。同様に、統合モードを使用している場合、 ApplicationPoolIdentityなどの組み込みのアプリケーションプールIDを使用した場合にも、この問題は発生しませんでした。ただし、私のアプリはサービスアカウントを使用してカスタムIDとして実行する必要があり、この時点で動作が表示されます。したがって、統合モードやカスタムIDが必要ない場合は、これを回避できる可能性があります。

おそらく、組み込みアカウントには、カスタムIDにはないpollingIntervalによって開始されたキャッシュメモリ統計収集を実行する権限があります。わかりません。

これがお役に立てば幸いです。あるいは、他の誰かがより多くの点に参加して、より良い回避策を見つけられることを願っています。

于 2013-02-20T16:15:52.670 に答える