1. Nuget инсталира съответния dll
Web API 2 : Install-Package Strathweb.CacheOutput.WebApi2 Web API 1 : Install-Package Strathweb.CacheOutput
Две. Създайте нов ActionFilterAttribute и презапишете свързаните методи
публичен клас WebApiOutputCacheAttribute : ActionFilterAttribute { Кеш време/секунда Частен международен _timespan; Време/секунда на кеша на клиента Частен международен _clientTimeSpan; Дали е кеширан от анонимни потребители редник bool _anonymousOnly; Кеширай индексния ключ частен струнен _cachekey; Кеш складове частен статичен само за четене: ObjectCache WebApiCache = MemoryCache.Default;
public WebApiOutputCacheAttribute(int timespan, int clientTimeSpan, bool anonymousOnly) { _timespan = времеви период; _clientTimeSpan = clientTimeSpan; _anonymousOnly = anonymousOnly; }
//是否缓存 private bool _isCacheable(HttpActionContext ac) { ако (_timespan > 0 и _clientTimeSpan > 0) { ако (_anonymousOnly) ако (Thread.CurrentPrincipal.Identity.IsAuthenticated) отговорът е фалшив; ако (ac. Request.Method == HttpMethod.Get) връща true; } Друго { хвърляне на new InvalidOperationException("Грешни аргументи"); } отговорът е фалшив; }
private CacheControlHeaderValue setClientCache() { var cachecontrol = нов CacheControlHeaderValue(); Cachecontrol. MaxAge = ВремеОбхват.FromSeconds(_clientTimeSpan); Cachecontrol. MustRevalidate = вярно; return cachecontrol; }
//Action调用前执行的方法 public override void OnActionExecuting(HttpActionContext ac) { ако (ac != null) { ако (_isCacheable(ac)) { _cachekey = струна. Join(":", нова струна[] { ac. Request.RequestUri.AbsolutePath, ac. Request.Headers.Accept.FirstOrDefault(). ToString() }); ако (WebApiCache.Contains(_cachekey)) { var val = (string)WebApiCache.Get(_cachekey); ако (val != null) { AC. Отговор = ac. Request.CreateResponse(); AC. Response.Content = нов StringContent(val); var contenttype = (MediaTypeHeaderValue)WebApiCache.Get(_cachekey + ":response-ct"); ако (contenttype == null) contenttype = new MediaTypeHeaderValue(_cachekey. Split(':')[1]); AC. Response.Content.Headers.ContentType = contenttype; AC. Response.Headers.CacheControl = setClientCache(); връщане; } } } } Друго { хвърли нов ArgumentNullException("ActionContext"); } }
//Action调用后执行方法 public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext) { ако (!( WebApiCache.Contains(_cachekey))) { var body = actionExecutedContext.Response.Content.ReadAsStringAsync(). Резултат; WebApiCache.Add(_cachekey, тяло, DateTime.Now.AddSeconds(_timespan)); WebApiCache.Add(_cachekey + ":response-ct", actionExecutedContext.Response.Content.Headers.ContentType, DateTime.Now.AddSeconds(_timespan)); } ако (_isCacheable(actionExecutedContext.ActionContext)) actionExecutedContext.ActionContext.Response.Headers.CacheControl = setClientCache(); }
}
3. Контролерът трябва да добави кеша към метода Get, за да добави филтъра
[WebApiOutputCache(120,60,false)] публичен низ GetShoppingCart() { връщане на "Hello World"; } Започнете, наблюдавайте точката на прекъсване и наблюдавайте ефекта. Целият процес е: инициализиране на кеш филтъра при стартиране, след това извикване на метода Get с добавения филтър, въвеждане на метода OnActionExecuting, определяне дали има релевантен кеш, ако има, връщане на резултата директно, ако не, извикване на Action на контролера, и след това извикване на метода OnActionExecuted, за да добавите съответната двойка ключ-стойност на кеша и зададете времето за изтичане на кеша за връщане на резултата. |