1. Nuget inštaluje príslušné dll
Web API 2 : Install-Package Strathweb.CacheOutput.WebApi2 Web API 1 : Install-Package Strathweb.CacheOutput
Dva. Vytvorte nový atribút ActionFilterAttribute a prepíšte súvisiace metódy
public class WebApiOutputCacheAttribute : ActionFilterAttribute { Čas cache za sekundu súkromný int _timespan; Čas za sekundu klientskej cache súkromný int _clientTimeSpan; Či je to uložené anonymnými používateľmi súkromný Bool _anonymousOnly; Ukladajte indexový kľúč do vyrovnávacej pamäte súkromný strunový _cachekey; Sklady cache súkromný statický readonly ObjectCache WebApiCache = MemoryCache.Default;
public WebApiOutputCacheAttribute(int timespan, int clientTimeSpan, bool anonymousOnly) { _timespan = časové rozpätie; _clientTimeSpan = clientTimeSpan; _anonymousOnly = anonymousOnly; }
//是否缓存 private bool _isCacheable(HttpActionContext ac) { ak (_timespan > 0 & _clientTimeSpan > 0) { ak (_anonymousOnly) if (Thread.CurrentPrincipal.Identity.IsAuthenticated) return false; Ak (AC. Request.Method == HttpMethod.Get) vráť true; } else { throw new InvalidOperationException("Nesprávne argumenty"); } return false; }
private CacheControlHeaderValue setClientCache() { var cachecontrol = nový CacheControlHeaderValue(); CacheControl. MaxAge = TimeSpan.OdSekúnd(_clientTimeSpan); CacheControl. MustRevalidate = pravda; vrátiť cachecontrol; }
//Action调用前执行的方法 public override void OnActionExecuting(HttpActionContext ac) { ak (ac != null) { ak (_isCacheable(ac)) { _cachekey = reťazec. Join(":", nový reťazec[] { ac. Request.RequestUri.AbsolutePath, ac. Request.Headers.Accept.FirstOrDefault(). ToString() }); if (WebApiCache.Contains(_cachekey)) { var val = (string)WebApiCache.Get(_cachekey); ak (val != null) { AC. Odpoveď = ac. Request.CreateResponse(); AC. Response.Content = nový StringContent(val); var contenttype = (MediaTypeHeaderValue)WebApiCache.Get(_cachekey + ":response-ct"); ak (contenttype == null) contenttype = nový MediaTypeHeaderValue(_cachekey. Split(':')[1]); AC. Response.Content.Headers.ContentType = contenttype; AC. Response.Headers.CacheControl = setClientCache(); návrat; } } } } else { throw new ArgumentNullException("actionContext"); } }
//Action调用后执行方法 verejné prepísanie zruší OnActionExecuted(HttpActionExecutedContext actionExecutedContext) { ak (!( WebApiCache.Contains(_cachekey))) { var body = actionExecutedContext.Response.Content.ReadAsStringAsync(). Výsledok; WebApiCache.Add(_cachekey, telo, DateTime.Now.AddSeconds(_timespan)); WebApiCache.Add(_cachekey + ":response-ct", actionExecutedContext.Response.Content.Headers.ContentType, DateTime.Now.AddSeconds(_timespan)); } ak (_isCacheable(actionExecutedContext.ActionContext)) actionExecutedContext.ActionContext.Response.Headers.CacheControl = setClientCache(); }
}
3. Kontrolér musí pridať cache do metódy Get na pridanie filtra
[WebApiOutputCache(120,60,false)] public string GetShoppingCart() { vrátiť "Hello World"; } začnite, pozorujte bod zlomu a pozorujte jeho efekt. Celý proces spočíva v tom: inicializovať filter cache pri štarte, potom zavolať metódu Get s pridaným filtrom, zadať metódu OnActionExecuting, zistiť, či existuje relevantná cache, ak áno, vrátiť výsledok priamo, ak nie, zavolať akciu kontroléra a potom zavolať metódu OnActionExecuted na pridanie príslušného páru kľúč-hodnota cache a nastaviť čas expirácie cache na vrátenie výsledku. |