1. A Nuget instala a DLL relevante
Web API 2 : Install-Package Strathweb.CacheOutput.WebApi2 Web API 1 : Install-Package Strathweb.CacheOutput
Dois. Crie um novo ActionFilterAttribute e substitua os métodos relacionados
classe pública WebApiOutputCacheAttribute : ActionFilterAttribute { Tempo de cache/segundo INT _timespan; Tempo de cache do cliente por segundo INT _clientTimeSpan; Se ele é armazenado em cache por usuários anônimos _anonymousOnly privado Bool; Armazene em cache a chave de índice _cachekey de corda particular; Depósitos de cache ObjectCache estático privado somente leitura WebApiCache = MemoryCache.Default;
público WebApiOutputCacheAttribute(int timespan, int clientTimeSpan, bool anonymousOnly) { _timespan = período de tempo; _clientTimeSpan = clienteTimeSpan; _anonymousOnly = anônimoApenas; }
//是否缓存 bool privado _isCacheable(HttpActionContext ac) { se (_timespan > 0 & _clientTimeSpan > 0) { se (_anonymousOnly) if (Thread.CurrentPrincipal.Identity.IsAuthenticated) retorne falso; se (ac. Request.Method == HttpMethod.Get) retorna true; } senão { lançar um novo InvalidOperationException ("Argumentos Errados"); } retorne falso; }
private CacheControlHeaderValue setClientCache() { var cachecontrol = new CacheControlHeaderValue(); Cachecontrol. MaxIdade = TempoDeIntervalo.DeSegundos(_clientTimeSpan); Cachecontrol. MustRevalidate = verdadeiro; retorne ao controle do cache; }
//Action调用前执行的方法 override público void OnActionExecuting(HttpActionContext ac) { se (ac != nulo) { se (_isCacheable(ac)) { _cachekey = corda. Join(":", nova string[] { ac. Request.RequestUri.AbsolutePath, ac. Request.Headers.Accept.FirstOrDefault(). ToString() }); if (WebApiCache.Contains(_cachekey)) { var val = (string)WebApiCache.Get(_cachekey); se (val != nulo) { AC. Resposta = ac. Request.CreateResponse(); AC. Response.Content = novo StringContent(val); var contenttype = (MediaTypeHeaderValue)WebApiCache.Get(_cachekey + ":response-ct"); if (contenttype == null) contenttype = novo MediaTypeHeaderValue(_cachekey. Split(':')[1]); AC. Resposta.Conteúdo.Cabeçalhos.ConteúdoTipo = contenttype; AC. Response.Headers.CacheControl = setClientCache(); retorno; } } } } senão { lançar um novo ArgumentNullException ("actionContext"); } }
//Action调用后执行方法 override público void OnActionExecuted(HttpActionExecutedContext actionExecutedContext) { se (!( WebApiCache.Contains(_cachekey))) { var body = actionExecutedContext.Response.Content.ReadAsStringAsync(). Resultado; WebApiCache.Add(_cachekey, corpo, 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. O controlador precisa adicionar o cache ao método Get para adicionar o filtro
[WebApiOutputCache(120,60,false)] cadeia pública GetShoppingCart() { retorno "Hello World"; } Comece, observe o ponto de quebra e observe o efeito. Todo o processo é: inicializar o filtro de cache na inicialização, depois chamar o método Get com o filtro adicionado, entrar no método OnActionExecuting, determinar se há cache relevante, se houver, retornar o resultado diretamente, se não, chamar a Ação do controlador e então chamar o método OnActionExecuted para adicionar o par chave-valor do cache relevante e definir o tempo de expiração do cache para retornar o resultado. |