2016-05-26 7 views
4

バージョンはrc1です。 は私の古いプロジェクトでは、私がIMemoryCacheを使用して、私は私がすべてのキャッシュを一覧表示するビューを作成したいASP.NETコア1のキャッシュをすべて取得します

var c = this._memoryCache; 
var data = c.Get("data"); 

のようなキーでキャッシュを取得することができ、コア1では

System.Web.Caching.Cache c = System.Web.HttpRuntime.Cache; 
System.Collections.IDictionaryEnumerator cacheEnumerator = c.GetEnumerator(); 
while (cacheEnumerator.MoveNext()) 
{....} 

のようなコードがあります。コア1にすべてのキャッシュを取得するにはどうすればよいですか?

答えて

3

githubのASP.NET CoreのMemoryCache実装のソースを調べると、 は、クラスがキャッシュエントリの一覧をスキャンまたは反復する機能を公開していないことがわかります。

あなたができる最も近い内側のキャッシュ辞書を読み取るために使用する反射です:

private readonly Dictionary<object, CacheEntry> _entries; 

ラップIMemoryCacheを受け入れ、IEnumerable<CacheEntry>返し、あなたは良いしている拡張メソッドで反射コード - しかし、そこに

  1. この実装は、現在のプレリリース版のASP.NET COREに固有のものです。それは内部実装の詳細で契約の一部ではないため、これは新しいバージョンで変更される可能性があります。
  2. これは、を実装したの1つであるを実装したMicrosoft.Extensions.Caching.Memory.MemoryCacheに固有のものです。あなたはいつかそれを別の実装に置き換えることができます。
  3. 実装には、キャッシュエントリへの同時アクセスを管理するための一連のロックが含まれています。内部ディクショナリを直接反復処理する場合、エントリの更新中にそのエントリを読み込もうとすると、並行処理エラーが発生する可能性があります。最初のステップはになりません。キャッシュエントリを直接更新し、常にIMemoryCacheのメソッドを実行しますが、その場合でもリスクがあります。

リスクを知っていれば、あなたは仕事を進めることができます。

+0

これを試してみると、[CacheEntryは保護レベルのためアクセスできません]というエラーが表示されます。私はMicrosoft.AspNetCore.Mvcの1.0.1を使用しています。 – DrGriff

+1

「反射専用メンバー」を検索します。プライベートメンバーにアクセスするには、特定のBindingFlagsを指定する必要があります。 –

+0

こんにちは。申し訳ありませんが、私は間違いではっきりしませんでした。次のコードを使用します。var flags = BindingFlags.Instance | BindingFlags.NonPublic; var entries = this.MemoryCache.GetType()。GetField( "_ entries"、flags).GetValue(this.MemoryCache);私はこのオブジェクトへの参照を取得します。 WATCHを使用すると、型は "object {System.Collections.Generic.Dictionary }"と表示されます。問題は、それをキャストしようとするときです:var dic = entries with Dictionary ;ここでは、CacheEntryが内部でアクセスできないというコンパイルエラーが発生します。続行する方法がわからない – DrGriff

1

リフレクションを使用する代わりに、キャッシュに追加するたびにディクショナリに追加し、キャッシュポリシーからのコールバックを使用してメンテナンスすることもできます。あなたがこのように扱うならば.net MemoryCacheに依存しません。おそらくディクショナリにいくつかの並行性の問題がありますが、更新と削除でロックされている限り、それはうまくいくはずです。

+0

In。net github私はMSがこれを改善すると思うので、この問題に関する問題があることがわかります。 – MichaelMao

関連する問題