1. Nuget namesti ustrezni dll
Web API 2 : Install-Package Strathweb.CacheOutput.WebApi2 Web API 1 : Install-Package Strathweb.CacheOutput
Dva. Ustvarite nov atribut ActionFilterAttribute in preglasite povezane metode
javni razred WebApiOutputCacheAttribute : ActionFilterAttribute { Čas predpomnilnika na sekundo vojakov Int _timespan; Čas/sekunda odjemalskega predpomnilnika zasebni int _clientTimeSpan; Ali jo anonimni uporabniki shranjujejo v predpomnilniku zasebni Bool _anonymousOnly; Predpomniš indeksni ključ zasebni strunski _cachekey; Skladišča predpomnilnika zasebni statični readonly ObjectCache WebApiCache = MemoryCache.Default;
public WebApiOutputCacheAttribute(int timespan, int clientTimeSpan, bool anonymousOnly) { _timespan = časovno obdobje; _clientTimeSpan = clientTimeSpan; _anonymousOnly = anonymousOnly; }
//是否缓存 private bool _isCacheable(HttpActionContext ac) { če (_timespan > 0 & _clientTimeSpan > 0) { če (_anonymousOnly) if (Thread.CurrentPrincipal.Identity.IsAuthenticated) return false; če (AC. Request.Method == HttpMethod.Get) vrni true; } else { throw new InvalidOperationException("Napačni argumenti"); } return false; }
private CacheControlHeaderValue setClientCache() { var cachecontrol = novi CacheControlHeaderValue(); Nadzor predpomnilnika. MaxAge = Časovni razpon.OdSekund(_clientTimeSpan); Nadzor predpomnilnika. MustRevalidate = resnično; vrni nadzor predpomnilnika; }
//Action调用前执行的方法 public override void OnActionExecuting(HttpActionContext ac) { če (ac != ničl) { if (_isCacheable(ac)) { _cachekey = niz. Join(":", nova struna[] { ac. Request.RequestUri.AbsolutePath, ac. Request.Headers.Accept.FirstOrDefault(). ToString() }); if (WebApiCache.Contains(_cachekey)) { var val = (string)WebApiCache.Get(_cachekey); če (val != ničl) { AC. Odziv = ac. Request.CreateResponse(); AC. Response.Content = nov StringContent(val); var contenttype = (MediaTypeHeaderValue)WebApiCache.Get(_cachekey + ":response-ct"); if (contenttype == null) contenttype = novi MediaTypeHeaderValue(_cachekey. Split(':')[1]); AC. Response.Content.Headers.ContentType = contenttype; AC. Response.Headers.CacheControl = setClientCache(); vrnitev; } } } } else { throw new ArgumentNullException("actionContext"); } }
//Action调用后执行方法 javno preglasitev razveljavi OnActionExecuted(HttpActionExecutedContext actionExecutedContext) { če (!( WebApiCache.Contains(_cachekey))) { var body = actionExecutedContext.Response.Content.ReadAsStringAsync(). Rezultat; WebApiCache.Add(_cachekey, telo, DateTime.Now.AddSeconds(_timespan)); WebApiCache.Add(_cachekey + ":response-ct", actionExecutedContext.Response.Content.Headers.ContentType, DateTime.Now.AddSeconds(_timespan)); } if (_isCacheable(actionExecutedContext.ActionContext)) actionExecutedContext.ActionContext.Response.Headers.CacheControl = setClientCache(); }
}
3. Krmilnik mora dodati predpomnilnik metodi Get za dodajanje filtra
[WebApiOutputCache(120,60,false)] javni niz GetShoppingCart() { vrnil "Hello World"; } Začni, opazuj prelomno točko in opazuj učinek. Celoten postopek je: ob zagonu inicializiraj filter predpomnilnika, nato pokličeš metodo Get z dodanim filtrom, vneseš metodo OnActionExecuting, ugotoviš, ali obstaja relevanten predpomnilnik, če obstaja, vrneš rezultat neposredno, če ne, pokličeš Action-kontrolerjev Action, nato pokličeš metodo OnActionExecute za dodajanje ustreznega para ključ-vrednost predpomnilnika in nastaviš čas poteka predpomnilnika, da vrne rezultat. |