Clear OutputCache – Minden oldal törlése

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


Dávid Zoltán

Dávid Zoltán Mérnök Informatikusként végeztem a BME-n, jelenleg webfejlesztéssel és gépi tanulással foglalkozom.

2010.05.05. 16:03:28 | Permalink | Hozzászólások: 0 | Tárgyszavak: , ,


  • Activation Error: Code 0x8007232b

    Balássy György (MS RD, ASP.NET MVP, MCTS) Épp egy Windows Server 2008 VPC-t telepítek és aktiválás közben az alábbi sokat mondó hibaüzenetet kaptam. Tovább »
  • WSS Event ID 2424 újra

    Balássy György (MS RD, ASP.NET MVP, MCTS) Korábban írtam már egyszer a Windows SharePoint Services által az Application Logba írt 2424-es azonostójú hibáról és annak egy lehetséges okáról. Most ismét sikerült előállítanom a hibát, de ezúttal a KB927012 sem segített. Tovább »


Írja meg Ön is véleményét!


Hozzászólásokat csak regisztrált, bejelentkezett felhasználóktól tudunk elfogadni!

Hozzászólások