1. Nuget įdiegia atitinkamą DLL
Web API 2: Install-Package Strathweb.CacheOutput.WebApi2 1 žiniatinklio API: diegimo paketas Strathweb.CacheOutput
Du. Sukurkite naują ActionFilterAttribute ir nepaisykite susijusių metodų
viešoji klasė WebApiOutputCacheAttribute : ActionFilterAttribute { Talpyklos laikas/sek privatus int _timespan; Kliento talpyklos laikas/sek privatus int _clientTimeSpan; Ar jį talpykloje saugo anoniminiai vartotojai privatus bool _anonymousOnly; Rodyklės rakto talpykla privatus styginių _cachekey; Talpyklos sandėliai privatus statinis tik skaitomas ObjectCache WebApiCache = MemoryCache.Default;
public WebApiOutputCacheAttribute(int timespan, int clientTimeSpan, bool anonymousOnly) { _timespan = laikotarpis; _clientTimeSpan = clientTimeSpan; _anonymousOnly = anonymousOnly; }
//是否缓存 privatus bool _isCacheable(HttpActionContext ac) { jei (_timespan > 0 & _clientTimeSpan > 0) { jei (_anonymousOnly) if (Thread.CurrentPrincipal.Identity.IsAuthenticated) grąžinti klaidingą; Jei (ac. Request.Method == HttpMethod.Get) grąžina true; } kitaip { mesti naują InvalidOperationException("Neteisingi argumentai"); } grąžinti klaidingą; }
privatus CacheControlHeaderValue setClientCache() { var cachecontrol = naujas CacheControlHeaderValue(); cachecontrol. MaxAge = TimeSpan.FromSeconds(_clientTimeSpan); cachecontrol. MustRevalidate = true; grąžinti talpyklos valdymą; }
//Action调用前执行的方法 viešasis nepaisymas void OnActionExecuting(HttpActionContext ac) { if (ac != null) { jei (_isCacheable (ac)) { _cachekey = eilutė. Join(":", nauja eilutė[] { ac. Request.RequestUri.AbsolutePath, ac. Request.Headers.Accept.FirstOrDefault(). ToString() }); if (WebApiCache.Contains(_cachekey)) { var val = (eilutė)WebApiCache.Get(_cachekey); if (val != null) { ac. Atsakymas = ac. Request.CreateResponse(); ac. Response.Content = naujas StringContent(val); var contenttype = (MediaTypeHeaderValue)WebApiCache.Get(_cachekey + ":response-ct"); if (contenttype == null) contenttype = naujas MediaTypeHeaderValue(_cachekey. Split(':')[1]); ac. Response.Content.Headers.ContentType = turinio tipas; ac. Response.Headers.CacheControl = setClientCache(); grąžinimas; } } } } kitaip { mesti naują ArgumentNullException("actionContext"); } }
//Action调用后执行方法 viešasis nepaisymas void OnActionExecuted(HttpActionExecutedContext actionExecutedContext) { jei (!( WebApiCache.Contains(_cachekey))) { var body = actionExecutedContext.Response.Content.ReadAsStringAsync(). Rezultatas; WebApiCache.Add(_cachekey, body, 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. Valdiklis turi pridėti talpyklą prie metodo Get, kad pridėtų filtrą
[WebApiOutputCache(120,60,false)] viešoji eilutė GetShoppingCart() { grįžti "Hello World"; } pradėkite, stebėkite lūžio tašką ir stebėkite efektą. Visas procesas yra toks: paleidžiant inicijuokite talpyklos filtrą, tada iškvieskite metodą Get su pridėtu filtru, įveskite metodą OnActionFulfuling, nustatykite, ar yra atitinkama talpykla, jei yra, grąžinkite rezultatą tiesiogiai, jei ne, iškvieskite valdiklio veiksmą, tada iškvieskite metodą OnAction, kad pridėtumėte atitinkamą talpyklos rakto ir reikšmės porą ir nustatytumėte talpyklos galiojimo laiką, kad gautumėte rezultatą. |