1. Nuget instaluje odpowiednie dll
Web API 2 : Install-Package Strathweb.CacheOutput.WebApi2 Web API 1 : Install-Package Strathweb.CacheOutput
Dwa. Stwórz nowy atrybut ActionFilterAttribute i nadpisz powiązane metody
public class WebApiOutputCacheAttribute : ActionFilterAttribute { Czas pamięci podręcznej na sekundę prywatny _timespan; Czas pamięci podręcznej klienta prywatny _clientTimeSpan; Czy jest przechowywana przez anonimowych użytkowników prywatny Bool _anonymousOnly; Zapisz klucz indeksowy prywatna struna _cachekey; Magazyny pamięci podręcznej prywatny, statyczny tylko do odczytu ObjectCache WebApiCache = MemoryCache.Default;
public WebApiOutputCacheAttribute(int timespan, int clientTimeSpan, bool anonymousOnly) { _timespan = przedział czasu; _clientTimeSpan = klientCzasCzasRozpęty; _anonymousOnly = anonimowyTylko; }
//是否缓存 private bool _isCacheable(HttpActionContext ac) { jeśli (_timespan > 0 & _clientTimeSpan > 0) { jeśli (_anonymousOnly) if (Thread.CurrentPrincipal.Identity.IsAuthenticated) return false; jeśli (ac. Request.Method == HttpMethod.Get) zwróć true; } else { throw new InvalidOperationException ("Wrong Argument"); } return false; }
private CacheControlHeaderValue setClientCache() { var cachecontrol = nowy CacheControlHeaderValue(); Kontrola pamięci podręcznej. MaxAge = CzasOkres.OdSekund(_clientTimeSpan); Kontrola pamięci podręcznej. MusiRevalidować = prawdziwe; return cachecontrol; }
//Action调用前执行的方法 public override unieważnia OnActionExecuting(HttpActionContext ac) { jeśli (ac != null) { if (_isCacheable(ac)) { _cachekey = struna. Join(":", nowy ciąg[] { ac. Request.RequestUri.AbsolutePath, ac. Request.Headers.Accept.FirstOrDefault(). ToString() }); if (WebApiCache.Contains(_cachekey)) { var val = (string)WebApiCache.Get(_cachekey); if (val != null) { AC. Odpowiedź = ac. Request.CreateResponse(); AC. Response.Content = nowy StringContent(val); var contenttype = (MediaTypeHeaderValue)WebApiCache.Get(_cachekey + ":response-ct"); if (contenttype == null) contenttype = nowy MediaTypeHeaderValue(_cachekey. Split(':')[1]); AC. Response.Content.Headers.ContentType = contenttype; AC. Response.Headers.CacheControl = setClientCache(); powrót; } } } } else { throw new ArgumentNullException("actionContext"); } }
//Action调用后执行方法 public override unieważnia OnActionExecuted(HttpActionExecutedContext actionExecutedContext) { if (!( WebApiCache.Contains(_cachekey))) { var body = actionExecutedContext.Response.Content.ReadAsStringAsync(). Wynik; WebApiCache.Add(_cachekey, ciało, 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 musi dodać pamięć podręczną do metody Get, aby dodać filtr
[WebApiOutputCache(120,60,false)] public string GetShoppingCart() { powrócił "Hello World"; } Zaczynaj, obserwuj punkt przełomowy i obserwuj efekt. Cały proces to: inicjalizacja filtra pamięci podręcznej przy starcie, następnie wywołanie metody Get z dodanym filtrem, wejście metody OnActionExecuting, określenie, czy istnieje odpowiednia pamięć podręczna, jeśli jest, bezpośrednie zwrócenie wyniku, jeśli nie, wywołanie Akcji kontrolera, a następnie wywołanie metody OnActionEkuene, aby dodać odpowiednią parę klucz-wartość pamięci podręcznej i ustawić czas wygaśnięcia pamięci podręcznej, aby zwrócić wynik. |