1. Nuget встановлює відповідний dll
Web API 2 : Install-Package Strathweb.CacheOutput.WebApi2 Web API 1 : Install-Package Strathweb.CacheOutput
Два. Створіть новий атрибут ActionFilterAttribute і перезапишіть відповідні методи
публічний клас WebApiOutputCacheAttribute : ActionFilterAttribute { Час кешу/сек Private int _timespan; Час кешу клієнта на секунду Private int _clientTimeSpan; Чи кешується вона анонімними користувачами рядовий бул-_anonymousOnly; Кешуйте індексний ключ приватний струнний _cachekey; Склади кешу приватний статичний лише для читання: ObjectCache WebApiCache = MemoryCache.Default;
public WebApiOutputCacheAttribute(int timespan, int clientTimeSpan, bool anonymousOnly) { _timespan = часовий проміжок; _clientTimeSpan = clientTimeSpan; _anonymousOnly = anonymousOnly; }
//是否缓存 приватний bool _isCacheable(HttpActionContext ac) { якщо (_timespan > 0 і _clientTimeSpan > 0) { якщо (_anonymousOnly) якщо (Thread.CurrentPrincipal.Identity.IsAuthenticated) повернення хибно; якщо (AC. Request.Method == HttpMethod.Get) поверне true; } інше { викинути new InvalidOperationException("Неправильні аргументи"); } повернення хибно; }
приватний CacheControlHeaderValue setClientCache() { var cachecontrol = новий CacheControlHeaderValue(); Контроль кешу. MaxAge = TimeSpan.FromSeconds(_clientTimeSpan); Контроль кешу. MustRevalidate = true; return cachecontrol; }
//Action调用前执行的方法 public override void OnActionExecuting(HttpActionContext ac) { якщо (ac != null) { якщо (_isCacheable(ac)) { _cachekey = струна. Join(":", new string[] { ac. Запит. Запит Uri. Абсолютний шлях, ac. Request.Headers.Accept.FirstOrDefault(). ToString() }); якщо (WebApiCache.Contains(_cachekey)) { var val = (рядок)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 = новий MediaTypeHeaderValue(_cachekey. Спліт(':')[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 для додавання відповідної пари ключ-значення кешу і встановити час закінчення кешу для повернення результату. |