1. Nuget instalează DLL-ul relevant
Web API 2 : Install-Package Strathweb.CacheOutput.WebApi2 Web API 1 : Install-Package Strathweb.CacheOutput
Doi. Creează un nou ActionFilterAttribute și înlocuiește metodele aferente
clasa publică WebApiOutputCacheAttribute : ActionFilterAttribute { Timp cache/secundă Private Int _timespan; Timp de cache al clientului/secundă private Int _clientTimeSpan; Dacă este stocată în cache de utilizatori anonimi soldat Bool _anonymousOnly; Stochează în cache cheia index _cachekey de șir privat; Depozite de cache privat static readonly ObiectCache WebApiCache = MemoryCache.Default;
public WebApiOutputCacheAttribute(int timespan, int clientTimeSpan, bool anonymousOnly) { _timespan = interval de timp; _clientTimeSpan = clientTimeSpan; _anonymousOnly = anonimOnly; }
//是否缓存 bool privat _isCacheable(HttpActionContext ac) { dacă (_timespan > 0 & _clientTimeSpan > 0) { dacă (_anonymousOnly) if (Thread.CurrentPrincipal.Identity.IsAuthenticated) returnează false; dacă (ac. Request.Method == HttpMethod.Get) returnează true; } altfel { aruncă un nou InvalidOperationException ("Argumente greșite"); } returnează false; }
private CacheControlHeaderValue setClientCache() { var cachecontrol = new CacheControlHeaderValue(); Cachecontrol. MaxAge = TimeSpan.FromSeconds(_clientTimeSpan); Cachecontrol. MustRevalidate = adevărat; returnează controlul cache-ului; }
//Action调用前执行的方法 public override void OnActionExecuting(HttpActionContext ac) { dacă (ac != nul) { dacă (_isCacheable(ac)) { _cachekey = șnur. Join(":", new string[] { ac. Request.RequestUri.AbsolutePath, ac. Request.Headers.Accept.FirstOrDefault(). ToString() }); if (WebApiCache.Contains(_cachekey)) { var val = (string)WebApiCache.Get(_cachekey); dacă (val != nul) { AC. Răspuns = ac. Request.CreateResponse(); AC. Response.Content = nou StringContent(val); var contenttype = (MediaTypeHeaderValue)WebApiCache.Get(_cachekey + ":response-ct"); if (contenttype == null) contenttype = noul MediaTypeHeaderValue(_cachekey. Split(':')[1]); AC. Response.Content.Headers.ContentType = contenttype; AC. Response.Headers.CacheControl = setClientCache(); returnare; } } } } altfel { aruncă un nou ArgumentNullException ("actionContext"); } }
//Action调用后执行方法 public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext) { dacă (!( WebApiCache.Contains(_cachekey))) { var body = actionExecutedContext.Response.Content.ReadAsStringAsync(). Rezultat; WebApiCache.Add(_cachekey, corp, 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. Controlerul trebuie să adauge cache-ul la metoda Get pentru a adăuga filtrul
[WebApiOutputCache(120,60,false)] șirul public GetShoppingCart() { returnează "Hello World"; } Începe, observă punctul de întrerupere și observă efectul. Întregul proces este: inițializează filtrul cache-ului la pornire, apoi apelează metoda Get cu filtrul adăugat, intră în metoda OnActionExecuting, determină dacă există un cache relevant, dacă există, returnează rezultatul direct, dacă nu, apelează Action-ul controlerului, apoi apelează metoda OnActionExecuted pentru a adăuga perechea cheie-valoare cache relevantă și setează timpul de expirare al cache-ului pentru a returna rezultatul. |