1. Nuget asentaa asiaankuuluvan dll:n
Web API 2 : Asennuspaketti Strathweb.CacheOutput.WebApi2 Web API 1 : Install-Package Strathweb.CacheOutput
Kaksi. Luo uusi ActionFilterAttribute ja ohita siihen liittyvät metodit
public class WebApiOutputCacheAttribute : ActionFilterAttribute { Välimuistiaika/sekunti yksityinen int _timespan; Asiakasvälimuistin aika/sekunti yksityinen int _clientTimeSpan; Onko se välimuistissa anonyymien käyttäjien toimesta sotamies Bool _anonymousOnly; Välimuisti indeksiavain yksityinen jousi_cachekey; Kätkövarastot yksityinen staattinen lukuvakituinen ObjectCache WebApiCache = MemoryCache.Default;
public WebApiOutputCacheAttribute(int timespan, int clientTimeSpan, bool anonymousOnly) { _timespan = aikaväli; _clientTimeSpan = clientTimeSpan; _anonymousOnly = anonyymiOnly; }
//是否缓存 private bool _isCacheable(HttpActionContext ac) { jos (_timespan > 0 && _clientTimeSpan > 0) { jos (_anonymousOnly) if (Thread.CurrentPrincipal.Identity.IsAuthenticated) palauta väärin; jos (ac. Request.Method == HttpMethod.Get) palauttaa true; } else { heittää uuden InvalidOperationException("Väärät argumentit"); } palauta väärin; }
yksityinen CacheControlHeaderValue setClientCache() { var cachecontrol = uusi CacheControlHeaderValue(); Välimuistikontrolli. MaxAge = TimeSpan.FromSeconds(_clientTimeSpan); Välimuistikontrolli. MustRevalidate = totta; return cachecontrol; }
//Action调用前执行的方法 public override void OnActionExecuting(HttpActionContext ac) { jos (ac != null) { if (_isCacheable(ac)) { _cachekey = merkkijono. Join(":", new string[] { ac. Request.RequestUri.AbsolutePath, ac. Request.Headers.Accept.FirstOrDefault(). ToString() }); if (WebApiCache.Contains(_cachekey)) { var val = (string)WebApiCache.Get(_cachekey); jos (val != null) { Ilmastointi. Vaste = ac. Request.CreateResponse(); Ilmastointi. Response.Content = uusi StringContent(val); var contenttype = (MediaTypeHeaderValue)WebApiCache.Get(_cachekey + ":response-ct"); if (contenttype == null) contenttype = uusi MediaTypeHeaderValue(_cachekey. Split(':')[1]); Ilmastointi. Response.Content.Headers.ContentType = contenttype; Ilmastointi. Response.Headers.CacheControl = setClientCache(); paluuta; } } } } else { heittää uuden ArgumentNullException("actionContext"); } }
//Action调用后执行方法 public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext) { jos (!( WebApiCache.Contains(_cachekey))) { var body = actionExecutedContext.Response.Content.ReadAsStringAsync(). Tulos; WebApiCache.Add(_cachekey, runko, 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. Ohjaimen täytyy lisätä välimuisti Get-metodiin lisätäkseen suodattimen
[WebApiOutputCache(120,60,väärin)] julkinen merkkijono GetShoppingCart() { palaa "Hello World"; } Aloita, tarkkaile katkeamispistettä ja seuraa vaikutusta. Koko prosessi on: alusta välimuistisuodatin käynnistyksessä ja kutsu sitten Get-metodi suodattimen lisättynä, syötä OnActionExecuting-metodi, määritä onko olemassa relevantti välimuisti, jos on, palauta tulos suoraan, jos ei, kutsu ohjaimen Action, ja kutsu sitten OnActionExecuted-metodi lisätäksesi sopivan välimuisti-avain-arvoparin ja asettaa välimuistin vanhenemisaika palauttamaan tulos. |