Jak programově odstranit stránku z output cache?

Output cache, neboli ukládání vygenerovaného výstupu do mezipaměti, takže se při dalším požadavku stránka nevolá znovu, je výtečný vynález. Častým dotazem je, jak lze takto nacacheovanou položku z mezipaměti odstranit. Existují na to dvě metody.

RemoveOutputCacheItem

Tato metoda přináleží třídě HttpResponse a odstraní z output cache položku s danou adresou. Dlužno přiznat, že mi nikdy moc k srdci nepřirostla.

Adresa se uvádí jako "absolutní virtuální cesta", tedy cesta od rootu web serveru (nikoliv vaší aplikace). Tj. musíte si zjistit cestu k rootu vaší aplikace a poskládat URL.

Tuto metodu nemůžete využít pro web user controls a nepodařilo se mi nijak vystopovat její chování pro více cacheovaných verzí stránky, např. podle parametru v URL.

Cache item dependency

Osobně dávám přednost jinému a velmi elegantnímu triku: jednotlivé položky v cache na sobě mohou být závislé. Při ukládání do cache tedy můžete svou stránku učinit závislou na nějaké jiné položce, jejíž název si zvolíte:

context.Response.ContentType = "image/gif";

context.Response.AppendHeader("Content-Disposition", "image; filename=\"icon.gif\"");

context.Response.Cache.SetCacheability(HttpCacheability.ServerAndPrivate);

context.Response.Cache.SetExpires(DateTime.Now.AddHours(8));

context.Response.Cache.VaryByParams["MediaTypeId"] = true;

context.Response.AddCacheItemDependency("MediaTypeIconFlag");

Poté, v okamžiku kdy chcete takto závislé stránky z cache odstranit, stačí změnit hodnotu předmětné položky v cache:

Cache.Insert("MediaTypeIconFlag", DateTime.Now, null, System.Web.Caching.Cache.NoAbsoluteExpiration, System.Web.Caching.Cache.NoSlidingExpiration, System.Web.Caching.CacheItemPriority.NotRemovable, null);

Tento složitější zápis používám proto, aby mi server při nedostatku paměti můj "flag" neodstranil. Není to nezbytně nutné, ale pak může dojít k "řetězové reakci".

Cacheování bylo též tématem včerejšího semináře konaného v Microsoftu, záznam z něho zpracovávám, až bude k dispozici, napíšu o něm zprávu na tento web.

  • Altairis
  • Nemesis
  • Microsoft MVP
  • IIS
  • ASP.NET