11

私のasp.netmvcアプリケーションでは、別のアクションメソッドでOutputCache属性を使用しています。OutputCache属性に関連するキャッシュの現在のエントリを表示することは可能ですか?私System.Web.HttpContext.Current.Cacheがこのタイプのエントリを見つけられない場合。よろしくお願いしますF。

4

1 に答える 1

12

出力キャッシュは一般公開されていないため、にはありませんSystem.Web.HttpContext.Current.Cache。ASP.NET 2では、これはCacheInternal_cachesメンバーに含まれています。これは、名前から推測できるように、内部抽象クラスのプライベートメンバーです。簡単な作業ではありませんが、リフレクションで取得することは可能です。

また、それを取得すると、構成ファイルのパスキャッシュ、動的に生成されたクラスキャッシュ、モバイル機能、生の応答キャッシュ(これは出力キャッシュアイテムのタイプです)など、あらゆる種類の内部キャッシュエントリが含まれていることがわかります。

出力キャッシュに関連するアイテムをフィルタリングできるとしましょう。問題は、キーと生の応答(バイト配列として)を除いて、人間が読み取れる情報があまり含まれていないことです。キーは通常、使用したGET(a1)またはPOST(a2)メソッドの情報、サイト名、ルート相対URL、および依存パラメーターのハッシュで構成されます。

これは一般的な問題点だったと思います。そのため、ASP.NET 4では、カスタム出力キャッシュプロバイダーの新しい概念が導入されました。OutputCacheProviderを継承する独自の出力キャッシュプロバイダーを実装し、すべてのエントリを返すメソッドを提供できます。この記事をチェックしてください-http://weblogs.asp.net/gunnarpeipman/archive/2009/11/19/asp-net-4-0-writing-custom-output-cache-providers.aspx。私は個人的に新しいOutputCacheインフラストラクチャを調べたことがないので、何か見つけたらそれについて書くのは面白いでしょう。

これは、内部キャッシュエントリを取得するためのコードです。Visual Studioでデバッグしているときに、それらの値を参照できます。

Type runtimeType = typeof(HttpRuntime);

PropertyInfo ci = runtimeType.GetProperty(
   "CacheInternal", 
   BindingFlags.NonPublic | BindingFlags.Static);

Object cache = ci.GetValue(ci, new object[0]);

FieldInfo cachesInfo = cache.GetType().GetField(
    "_caches", 
    BindingFlags.NonPublic | BindingFlags.Instance);
object cacheEntries = cachesInfo.GetValue(cache);

List<object> outputCacheEntries = new List<object>();

foreach (Object singleCache in cacheEntries as Array)
{
   FieldInfo singleCacheInfo =
   singleCache.GetType().GetField("_entries",
      BindingFlags.NonPublic | BindingFlags.Instance);
   object entries = singleCacheInfo.GetValue(singleCache);

   foreach (DictionaryEntry cacheEntry in entries as Hashtable)
   {
      FieldInfo cacheEntryInfo = cacheEntry.Value.GetType().GetField("_value",
         BindingFlags.NonPublic | BindingFlags.Instance);
      object value = cacheEntryInfo.GetValue(cacheEntry.Value);
      if (value.GetType().Name == "CachedRawResponse")
      { 
         outputCacheEntries.Add(value);
      }
   }
}
于 2010-12-10T16:21:59.417 に答える