Ștergerea cache-ului de pagini în ASP.NET

Pentru blogul meu vreau să folosesc Cache-ul de ieșire pentru a salva o versiune cache a unui post perticular timp de aproximativ 10 minute, și thats fine ...

<%@OutputCache Duration="600" VaryByParam="*" %>

Cu toate acestea, dacă cineva publică un comentariu, vreau să șterg cache-ul, astfel încât pagina să fie actualizată și comentariul să poată fi văzut.

Cum pot face acest lucru în ASP.Net C #?

0
fr hi bn

7 răspunsuri

Am gasit raspunsul pe care il caut:

HttpResponse.RemoveOutputCacheItem("/caching/CacheForever.aspx");
0
adăugat
Nu cred că caching-ul era disponibil în ASP, așa că nu-mi pare rău.
adăugat autor GateKiller, sursa
Folosesc MVC 5.2.3, unde ar trebui să scriu acest cod?
adăugat autor Mohammad Dayyan, sursa
știe cineva dacă ceva de genul acesta este disponibil pentru clasic ASP?
adăugat autor Brettski, sursa
Acest lucru șterge toate cache-urile pentru fiecare pentru fiecare paramuri pentru acea pagină.
adăugat autor Salim, sursa
Folosesc un control al utilizatorilor web pentru meniuri dinamice, eu folosesc outputcache și vreau să elimină memoria cache la logout, am folosit soluția ta și mi-a trecut calea de control al utilizatorului, dar nu a lucrat pentru mine.
adăugat autor Neha Thakur, sursa

Dacă modificați "*" doar la parametrii pe care cache-ul ar trebui să le varieze (PostID?), Puteți face ceva de genul:

//add dependency
string key = "post.aspx?id=" + PostID.ToString();
Cache[key] = new object();
Response.AddCacheItemDependency(key);

și când cineva adaugă un comentariu ...

Cache.Remove(key);

Cred că acest lucru ar funcționa chiar și cu VaryByParam *, deoarece toate cererile ar fi legate de aceeași dependență de memorie cache.

0
adăugat

Hmm. Puteți specifica un atribut VaryByCustom pe elementul OutputCache. Valoarea acestui lucru este trecut ca parametru pentru metoda GetVaryByCustomString pe care o puteți implementa în global.asax. Valoarea returnată de această metodă este utilizată ca un index în elementele stocate în memoria cache - dacă returnezi numărul de comentarii pe pagină, de exemplu, de fiecare dată când este adăugat un comentariu, o pagină nouă va fi stocată în cache.

Atenția la acest lucru este că acest lucru nu elimină de fapt cache-ul. Dacă o intrare pe blog devine o utilizare greu de comentat, memoria cache ar putea exploda în dimensiune cu această metodă.

În mod alternativ, ați putea implementa biții nemenționați ai paginii (navigarea, anunțurile, intrarea blogului propriu-zis) ca controale de utilizator și să implementați cache-ul parțial al paginilor pe fiecare dintre aceste controale de utilizator.

0
adăugat

de ce nu utilizați dependența sqlcache de tabelul de postări?

sqlcachedependency msdn

În acest fel, nu implementați codul de compensare a cache-ului personalizat și pur și simplu actualizați cache-ul în timp ce conținutul modifică în db?

0
adăugat

HttpRuntime.Close() .. I try all method and this is the only that work for me

0
adăugat
Aș bănui că acest lucru închide procesul de depunere a aplicațiilor ASP.NET pe IIS. Acest lucru pare un pic excesiv, probabil că ar elimina toate cache-urile și ar avea probleme semnificative de performanță pe site-urile mari.
adăugat autor GateKiller, sursa

The above are fine if you know what pages you want to clear the cache for. In my instance (ASP.NET MVC) I referenced the same data from all over. Therefore, when I did a [save] I wanted to clear cache site wide. This is what worked for me: http://aspalliance.com/668

Acest lucru se face în contextul unui filtru OnActionExecuting. S-ar putea realiza la fel de usor cu ajutorul sistemului OnActionExecuting intr-un BaseController sau ceva de genul acesta.

HttpContextBase httpContext = filterContext.HttpContext;
httpContext.Response.AddCacheItemDependency("Pages");

Înființat:

protected void Application_Start()
{
    HttpRuntime.Cache.Insert("Pages", DateTime.Now);
}

Minor Tweak: Am un ajutor care adaugă "mesaje flash" (Mesaje de eroare, mesaje de succes - "Acest articol a fost salvat cu succes", etc). Pentru a evita ca mesajul flash să apară la fiecare GET ulterior, a trebuit să invalid după scrierea mesajului flash.

Ștergerea memoriei cache:

HttpRuntime.Cache.Insert("Pages", DateTime.Now);

Sper că acest lucru vă ajută.

0
adăugat
funcționează la întoarcerea unui jurnal
adăugat autor Sam Jones, sursa
@Kevin puteți explica cum să ștergeți toate paginile cache ale site-ului după logout
adăugat autor Mohit Shah, sursa
@ and.maz În cazul în care ați dat seama cum să faceți acest lucru pentru acțiunile copilului, există o recompensă aici .
adăugat autor marapet, sursa
și da. Ți-ai dat seama asta?
adăugat autor Hubert Jarema, sursa
Ir funcționează numai pentru cache-ul întregii pagini. Nu funcționează pentru acțiunile copilului. Orice sugestii?
adăugat autor Andrei M, sursa
Acest lucru nu a funcționat pentru mine. Această imposibilitate de a șterge elemente dintr-un cache pare ca un neajuns enorm în mvc
adăugat autor Dave Lawrence, sursa
Probabil, nu puteți șterge cache-ul deoarece utilizați @ Html.Action() pentru a reda vizualizarea parțială. Va trebui să utilizați OutputCacheAttribute.ChildActionCache = noul MemoryCache ("NewRandomStringNameToClearTheCache"); pentru a șterge întreaga "memorie cache" (pentru toate acțiunile copilului - Se pare că nu există o abordare mai bună fără a utiliza o bibliotecă ). dotnet.dzone.com/articles/programmatically-clearing-0
adăugat autor user2173353, sursa

La evenimentul de încărcare a paginii principale, scrieți următoarele:

Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(-1));
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetNoStore();

iar în butonul de logout faceți clic pe:

Session.Abandon();
Session.Clear();
0
adăugat