1. Nuget instaluje příslušné dll
Web API 2 : Install-Package Strathweb.CacheOutput.WebApi2 Web API 1 : Install-Package Strathweb.CacheOutput
Dva. Vytvořte nový ActionFilterAttribute a přepsejte příslušné metody
public class WebApiOutputCacheAttribute : ActionFilterAttribute { Čas cache/sekunda soukromý int _timespan; Čas za sekundu klientské cache soukromý int _clientTimeSpan; Zda je ukládán anonymními uživateli Vojína Bool _anonymousOnly; Uložte indexový klíč do mezipaměti soukromý strunový _cachekey; Sklady keše soukromý statický readonly ObjectCache WebApiCache = MemoryCache.Default;
public WebApiOutputCacheAttribute(int timespan, int clientTimeSpan, bool anonymousOnly) { _timespan = časové období; _clientTimeSpan = klientČasObdobí; _anonymousOnly = anonymOnly; }
//是否缓存 private bool _isCacheable(HttpActionContext ac) { pokud (_timespan > 0 & _clientTimeSpan > 0) { pokud (_anonymousOnly) if (Thread.CurrentPrincipal.Identity.IsAuthenticated) return false; pokud (AC. Request.Method == HttpMethod.Get) vrať true; } jinak { throw new InvalidOperationException ("Wrong Argument"); } return false; }
private CacheControlHeaderValue setClientCache() { var cachecontrol = nový CacheControlHeaderValue(); CacheControl. MaxAge = TimeSpan.OdSeconds(_clientTimeSpan); CacheControl. MusíRevalidovat = pravda; return cachecontrol; }
//Action调用前执行的方法 veřejné přepsání neplatní OnActionExecuting(HttpActionContext ac) { pokud (ac != null) { if (_isCacheable(ac)) { _cachekey = řetězec. Join(":", nový řetěz[] { ac. Request.RequestUri.AbsolutePath, ac. Request.Headers.Accept.FirstOrDefault(). ToString() }); if (WebApiCache.Contains(_cachekey)) { var val = (string)WebApiCache.Get(_cachekey); if (val != null) { AC. Odpověď = ac. Request.CreateResponse(); AC. Response.Content = nový StringContent(val); var contenttype = (MediaTypeHeaderValue)WebApiCache.Get(_cachekey + ":response-ct"); pokud (contenttype == null) contenttype = nový MediaTypeHeaderValue(_cachekey. Split(':')[1]); AC. Response.Content.Headers.ContentType = contenttype; AC. Response.Headers.CacheControl = setClientCache(); návrat; } } } } jinak { throw new ArgumentNullException("actionContext"); } }
//Action调用后执行方法 veřejné přepsání neplatné OnActionExecuted(HttpActionExecutedContext actionExecutedContext) { if (!( WebApiCache.Contains(_cachekey))) { var body = actionExecutedContext.Response.Content.ReadAsStringAsync(). Výsledek; WebApiCache.Add(_cachekey, tělo, 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. Kontroler musí přidat cache do metody Get pro přidání filtru
[WebApiOutputCache(120,60,false)] public string GetShoppingCart() { vrátit "Hello World"; } začněme, sledujte bod zlomu a sledujte jeho efekt. Celý proces je: inicializovat filtr cache při startu, poté zavolat metodu Get s přidaným filtrem, zadat metodu OnActionExecuting, zjistit, zda existuje relevantní cache, pokud ano, vrátit výsledek přímo, pokud ne, zavolat Action-Action, a poté zavolat metodu OnActionExecute pro přidání příslušného páru klíč-hodnota cache a nastavit čas expirace cache tak, aby se vrátil výsledek. |