1. Nuget installerar relevant dll
Web API 2 : Install-Package Strathweb.CacheOutput.WebApi2 Web API 1 : Install-Package Strathweb.CacheOutput
Två. Skapa ett nytt ActionFilterAttribute och åsidosätt de relaterade metoderna
public class WebApiOutputCacheAttribute : ActionFilterAttribute { Cachetid/sekund privat int _timespan; Klientcachetid/sekund privat int _clientTimeSpan; Om den är cachad av anonyma användare Private Bool _anonymousOnly; Cache indexnyckeln privat sträng _cachekey; Cachelager privat statisk readonly ObjectCache WebApiCache = MemoryCache.Default;
public WebApiOutputCacheAttribute(int timespan, int clientTimeSpan, bool anonymousOnly) { _timespan = tidsspann; _clientTimeSpan = clientTimeSpan; _anonymousOnly = anonymEndast anonym; }
//是否缓存 private bool _isCacheable(HttpActionContext ac) { om (_timespan > 0 & _clientTimeSpan > 0) { om (_anonymousOnly) if (Thread.CurrentPrincipal.Identity.IsAuthenticated) returnera falsk; Om (AC. Request.Method == HttpMethod.Get) returnerar true; } annars { kasta ny InvalidOperationException("Wrong Arguments"); } returnera falsk; }
privat CacheControlHeaderValue setClientCache() { var cachecontrol = ny CacheControlHeaderValue(); cachekontroll. MaxAge = TimeSpan.FromSeconds(_clientTimeSpan); cachekontroll. MåOmvalidera = sant; returnera cachekontroll; }
//Action调用前执行的方法 public override void OnActionExecuting(HttpActionContext ac) { om (ac != null) { om (_isCacheable(ac)) { _cachekey = sträng. Join(":", ny sträng[] { ac. Request.RequestUri.AbsolutePath, ac. Request.Headers.Accept.FirstOrDefault(). ToString() }); om (WebApiCache.Contains(_cachekey)) { var val = (string)WebApiCache.Get(_cachekey); om (val != null) { AC. Respons = ac. Request.CreateResponse(); AC. Response.Content = ny StringContent(val); var contenttype = (MediaTypeHeaderValue)WebApiCache.Get(_cachekey + ":response-ct"); om (contenttype == null) contenttype = ny MediaTypeHeaderValue(_cachekey. Split(':')[1]); AC. Response.Content.Headers.ContentType = contenttype; AC. Response.Headers.CacheControl = setClientCache(); återvända; } } } } annars { kasta ny ArgumentNullException("actionContext"); } }
//Action调用后执行方法 public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext) { om (!( WebApiCache.Contains(_cachekey))) { var body = actionExecutedContext.Response.Content.ReadAsStringAsync(). Resultat; WebApiCache.Add(_cachekey, body, DateTime.Now.AddSeconds(_timespan)); WebApiCache.Add(_cachekey + ":response-ct", actionExecutedContext.Response.Content.Headers.ContentType, DateTime.Now.AddSeconds(_timespan)); } om (_isCacheable(actionExecutedContext.ActionContext)) actionExecutedContext.ActionContext.Response.Headers.CacheControl = setClientCache(); }
}
3. Kontrollern måste lägga till cachen i Get-metoden för att lägga till filtret
[WebApiOutputCache(120,60,false)] offentlig sträng GetShoppingCart() { återvänder "Hello World"; } Börja, observera brytpunkten och observera effekten. Hela processen går ut på: initiera cachefiltret vid uppstart, och anropa sedan Get-metoden med filtret tillagt, ange OnActionExexing-metoden, avgöra om det finns en relevant cache, om det finns, returnera resultatet direkt, om inte, anropa kontrollerns Action, och sedan anropa OnActionExekvered-metoden för att lägga till det relevanta cache-nyckel-värde-paret och sätta cachens utgångstid för att returnera resultatet. |