1. Nuget устанавливает соответствующую DLL
Web API 2 : Install-Package Strathweb.CacheOutput.WebApi2 Web API 1 : Install-Package Strathweb.CacheOutput
Два. Создайте новый ActionFilterAttribute и переопределите связанные методы
публичный класс WebApiOutputCacheAttribute : ActionFilterAttribute { Время кэша в секунду Частный Int _timespan; Время/секунда кэша клиента рядовой международный _clientTimeSpan; Кэшируется ли она анонимными пользователями рядовой бул-_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(); Контроль кэша. MaxAge = TimeSpan.FromSeconds(_clientTimeSpan); Контроль кэша. MustRevalidate = true; возврат управления кэшированием; }
//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 = (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 = новый 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, body, 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 для добавления соответствующей пары ключ-значение кэша и установить время истечения кэша для возврата результата. |