ASP.NET-ben az OutputCacheből az elemek csak egyenként törölhetők a HttpResponse.RemoveOutputCacheItem(string path) segítségével. Vagy egyszerre többen, ha mindannyian dependelnek egy közös elemre. A közös elemre dependelés nyilvántartása, és ennek egy nagy alkalmazásba történő utólagos beillesztése baromi macerás. Mit tehetnek azok, akik csak úgy ki szeretnék törölni az OutputCachet, mondjuk fejlesztés közben? Volt már ilyen problémád? Téged is idegesített, hogy nincs RemoveAll() vagy Clear() metódus? Az alábbi kódot egy ASPX-be copypastelve, és onnan meghívva már kis is törölheted az OutputCachet. Vigyázat: csak fejlesztési célra, érdeklődés jelleggel és saját felelősségre. A kód kifejezetten ronda és dokumentálatlan, a publikus API-ból kimaradt osztályokat és metódusokat használ!
/// <summary>
/// Kitörli az Outputcachet, Reflection segítségével, érzés alapján.
/// A működésére semmilyen garancia nincs.
/// </summary>
private void clearOutputCache()
{
Type ct = this.Cache.GetType();
FieldInfo cif = ct.GetField( "_cacheInternal", BindingFlags.NonPublic | BindingFlags.Instance );
Type cmt = Cache.GetType().Assembly.GetType( "System.Web.Caching.CacheMultiple" );
Type cachekeyType = Cache.GetType().Assembly.GetType( "System.Web.Caching.CacheKey" );
FieldInfo cachesfield = cmt.GetField( "_caches", BindingFlags.NonPublic | BindingFlags.Instance );
object cacheInternal = cif.GetValue( this.Cache );
object caches = cachesfield.GetValue( cacheInternal );
Type arrayType = typeof( Array );
MethodInfo arrayGetter = arrayType.GetMethod( "GetValue", new Type[] { typeof( int ) } );
object cacheSingle = arrayGetter.Invoke( caches, new object[] { 1 } );
FieldInfo entriesField = cacheSingle.GetType().GetField( "_entries", BindingFlags.Instance | BindingFlags.NonPublic );
Hashtable entries = (Hashtable) entriesField.GetValue( cacheSingle );
List<object> keys = new List<object>();
foreach( object o in entries.Keys )
{
keys.Add( o );
}
MethodInfo remove = cacheInternal.GetType().GetMethod( "Remove", BindingFlags.NonPublic | BindingFlags.Instance, null,
new Type[] { cachekeyType, typeof( CacheItemRemovedReason ) }, null );
foreach( object key in keys )
{
remove.Invoke( cacheInternal, new object[] { key, CacheItemRemovedReason.Removed } );
}
}