Am o ASP.NET MVC 3 aplicație. Această aplicație solicită înregistrări prin JQuery. JQuery apeluri înapoi la un controler de acțiune care returnează rezultatele în format JSON. Nu am fost în măsură să dovedească acest lucru, dar am'm îngrijorat de faptul că datele mele pot fi memorate în cache.
Vreau doar caching pentru a fi aplicate la acțiuni specifice, nu pentru toate acțiunile.
Există un atribut care poate fi pus pe o acțiune pentru a se asigura că datele nu se cache? Dacă nu, cum pot asigura că browser-ul devine un nou set de înregistrări de fiecare dată, în loc de un cache set?
Pentru a se asigura că JQuery e't cache rezultatele, pe ajax metode, pune următoarele:
$.ajax({
cache: false
//rest of your ajax setup
});
Sau pentru a preveni cache în MVC, am creat propria noastră atribut, ai putea face la fel. Aici's codul nostru:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public sealed class NoCacheAttribute : ActionFilterAttribute
{
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
filterContext.HttpContext.Response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1));
filterContext.HttpContext.Response.Cache.SetValidUntilExpires(false);
filterContext.HttpContext.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
filterContext.HttpContext.Response.Cache.SetNoStore();
base.OnResultExecuting(filterContext);
}
}
Apoi decora doar cu controller [NoCache]
. SAU să-l facă pentru toți ai putea pune doar atributul pe clasa de clasa de baza care moștenesc controlorii de la (dacă aveți unul) ca avem aici:
[NoCache]
public class ControllerBase : Controller, IControllerBase
Puteți decora, de asemenea, unele dintre acțiunile cu acest atribut dacă aveți nevoie de ele să fie non-cacheable, în loc de a decora întreaga controller.
Dacă clasa ta sau acțiune n't au "NoCache" atunci când a fost pronunțată în browser-ul dvs. și doriți să verificați-l's de lucru, amintiți-vă că, după întocmirea modificări care aveți nevoie pentru a face un "hard refresh" (Ctrl+F5) în browser-ul dumneavoastră. Până când veți face așa, browser-ul va păstra vechea versiune din cache, și a câștigat't reîmprospăta cu o "normal refresh" (F5).
Puteți utiliza construit în cache atribut pentru a preveni memorarea în cache.
Pentru .net Framework: [OutputCache(NoStore = true, Durata = 0)]
Pentru .net Core: [ResponseCache(NoStore = true, Durata = 0)]
Fi conștienți de faptul că este imposibil de a forța browser-ul pentru a dezactiva cache-ul. Tot ce puteți face este de a oferi sugestii care cele mai multe browsere va onora, de obicei în formă de anteturi sau meta tag-uri. Acest decorator atribut va dezactiva server caching și adăuga, de asemenea, acest antet: Cache-Control: public, nu-magazin, max-age=0
. Nu adauga meta tag-uri. Dacă se dorește, acestea pot fi adăugate manual în vedere.
În plus, JQuery și alte clientul cadre va încerca să păcălească browser-ul în care nu utilizează it's versiune din cache a unei resurse prin adăugarea de lucruri pentru a url-ul, ca o amprentă de timp sau GUID. Acest lucru este eficient în a face browser-ul cere resursa din nou, dar nu't într-adevăr a preveni memorarea în cache.
Pe o notă finală. Ar trebui să fie conștienți de faptul că resursele pot fi, de asemenea, memorate în cache în între server și client. ISP's, proxy-uri, și alte dispozitive de rețea, de asemenea, cache-ul de resurse și ei folosesc de multe ori normelor interne, fără a uita la resurse reale. Nu e't de mult vă puteți face despre acestea. Vestea bună este că ei de obicei cache pentru scurte perioade de timp, cum ar fi câteva secunde sau minute.
Tot ce ai nevoie este:
[OutputCache(Duration=0)]
public JsonResult MyAction(
sau, dacă doriți să-l dezactivați pentru o întreagă Controller:
[OutputCache(Duration=0)]
public class MyController
În ciuda dezbaterii în comentarii aici, acest lucru este suficient pentru a dezactiva browser-ul cache - acest lucru provoacă ASP.Net pentru a emite anteturile de răspuns care spune browser-ului documentul expiră imediat:
În controler de acțiune pentru a adăuga antet următoarele linii
public ActionResult Create(string PositionID)
{
Response.AppendHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
Response.AppendHeader("Pragma", "no-cache"); // HTTP 1.0.
Response.AppendHeader("Expires", "0"); // Proxies.
Aici's "NoCache" atribut propus de mattytommo, simplificate prin utilizarea informațiilor de la Chris Moschini's răspuns:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public sealed class NoCacheAttribute : OutputCacheAttribute
{
public NoCacheAttribute()
{
this.Duration = 0;
}
}
Pentru MVC6 (DNX), nu există nici un Sistem.Web.OutputCacheAttribute`
Notă: atunci când setați `NoStore Durata parametru nu este luat în considerare. Este posibil să setați o durată inițială pentru prima înmatriculare și trece peste acest lucru cu atribute personalizate.
Dar ne-am Microsoft.AspNet.Mvc.Filtre.ResponseCacheFilter
public void ConfigureServices(IServiceCollection services)
...
services.AddMvc(config=>
{
config.Filters.Add(
new ResponseCacheFilter(
new CacheProfile() {
NoStore=true
}));
}
...
)
Este posibil să suprascrie inițială filtru cu un atribut personalizat
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public sealed class NoCacheAttribute : ActionFilterAttribute
{
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
var filter=filterContext.Filters.Where(t => t.GetType() == typeof(ResponseCacheFilter)).FirstOrDefault();
if (filter != null)
{
ResponseCacheFilter f = (ResponseCacheFilter)filter;
f.NoStore = true;
//f.Duration = 0;
}
base.OnResultExecuting(filterContext);
}
}
Aici este un caz de utilizare
[NoCache]
[HttpGet]
public JsonResult Get()
{
return Json(new DateTime());
}
Corect valoarea atributului pentru Asp.Net MVC de Bază pentru a preveni browser caching (inclusiv Internet Explorer 11) este:
[ResponseCache(Location = ResponseCacheLocation.None, NoStore = true)]
după cum este descris în documentația Microsoft: