1. Nuget paigaldab vastava DLL-i
Veebi API 2 : Install-Package Strathweb.CacheOutput.WebApi2 Web API 1 : Install-Package Strathweb.CacheOutput
Kaks. Loo uus ActionFilterAtribuut ja üle kirjuta seotud meetodid
public class WebApiOutputCacheAttribute : ActionFilterAttribute { Vahemälu aeg/sekund privaatne int _timespan; Kliendi vahemälu aeg/sekund privaatne intellekt _clientTimeSpan; Kas see on anonüümsete kasutajate poolt vahemällu salvestatud eraväelane Bool _anonymousOnly; Vahemällu salvesta indeksvõti privaatne keelpill _cachekey; Varulad privaatne staatiline ainult lugemine ObjectCache WebApiCache = MemoryCache.Default;
public WebApiOutputCacheAttribute(int timespan, int clientTimeSpan, bool anonymousOnly) { _timespan = ajavahemik; _clientTimeSpan = clientTimeSpan; _anonymousOnly = anonüümneAinult; }
//是否缓存 private bool _isCacheable(HttpActionContext ac) { kui (_timespan > 0 && _clientTimeSpan > 0) { if (_anonymousOnly) if (Thread.CurrentPrincipal.Identity.IsAuthenticated) tagasta vale; kui (AC. Request.Method == HttpMethod.Get) tagastab tõe; } else { viska uus InvalidOperationException("Valed argumendid"); } tagasta vale; }
private CacheControlHeaderValue setClientCache() { var cachecontrol = uus CacheControlHeaderValue(); cache control. MaxAge = TimeSpan.FromSeconds(_clientTimeSpan); cache control. MustRevalidate = tõene; return cache control; }
//Action调用前执行的方法 public override void OnActionExecuting(HttpActionContext ac) { kui (ac != null) { kui (_isCacheable(ac)) { _cachekey = string. Join(":", new string[] { ac. Request.RequestUri.AbsolutePath, ac. Request.Headers.Accept.FirstOrDefault(). ToString() }); if (WebApiCache.Contains(_cachekey)) { var val = (string)WebApiCache.Get(_cachekey); if (val != null) { Konditsioneer. Vastus = ac. Request.CreateResponse(); Konditsioneer. Response.Content = uus StringContent(val); var contenttype = (MediaTypeHeaderValue)WebApiCache.Get(_cachekey + ":response-ct"); if (contenttype == null) contenttype = uus MediaTypeHeaderValue(_cachekey. Split(':')[1]); Konditsioneer. Response.Content.Headers.ContentType = contenttype; Konditsioneer. Response.Headers.CacheControl = setClientCache(); tagasitulek; } } } } else { viska uus ArgumentNullException("actionContext"); } }
//Action调用后执行方法 public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext) { kui (!( WebApiCache.Contains(_cachekey))) { var body = actionExecutedContext.Response.Content.ReadAsStringAsync(). Tulemus; WebApiCache.Add(_cachekey, keha, 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. Kontroller peab lisama vahemälu Get meetodile, et lisada filter
[WebApiOutputCache(120,60,vale)] avalik string GetShoppingCart() { tagasi "Hello World"; } Alusta, jälgi murdepunkti ja jälgi selle mõju. Kogu protsess on järgmine: initsialiseeri vahemälufilter käivitamisel, seejärel kutsu Get meetod koos filtriga kaasatud, sisesta OnActionExecuting meetod, määra, kas on asjakohane vahemälu, kui on, tagasta tulemus otse, kui ei ole, kutsu kontrolleri Action ja seejärel kutsu OnActionExecuted meetod, et lisada vastav vahemälu võti-väärtuse paar ning määrata vahemälu aegumisaeg tulemuse tagastamiseks. |