Este artigo é um artigo espelhado de tradução automática, por favor clique aqui para ir para o artigo original.

Vista: 14395|Resposta: 1

[WebAPI] ASP.Net Cache de saída em ASP.NET Web API

[Copiar link]
Publicado em 17/01/2019 16:40:51 | | |
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.




Anterior:Desinstale a ferramenta redundante de aplicação Win10
Próximo:"CSS World" por Zhang Xinxu azw3+mobi+epub
Publicado em 19/01/2019 09:09:45 |
Bom
Disclaimer:
Todo software, material de programação ou artigos publicados pela Code Farmer Network são apenas para fins de aprendizado e pesquisa; O conteúdo acima não deve ser usado para fins comerciais ou ilegais, caso contrário, os usuários terão todas as consequências. As informações deste site vêm da Internet, e disputas de direitos autorais não têm nada a ver com este site. Você deve deletar completamente o conteúdo acima do seu computador em até 24 horas após o download. Se você gosta do programa, por favor, apoie um software genuíno, compre o registro e obtenha serviços genuínos melhores. Se houver qualquer infração, por favor, entre em contato conosco por e-mail.

Mail To:help@itsvse.com