Cet article est un article miroir de traduction automatique, veuillez cliquer ici pour accéder à l’article original.

Vue: 14395|Répondre: 1

[WebAPI] ASP.Net Mise en cache de sortie dans ASP.NET API Web

[Copié le lien]
Publié sur 17/01/2019 16:40:51 | | |
1. Nuget installe la DLL pertinente

Web API 2 : Install-Package Strathweb.CacheOutput.WebApi2
Web API 1 : Install-Package Strathweb.CacheOutput

Deux. Créez un nouvel ActionFilterAttribute et supprimez les méthodes associées

    classe publique WebApiOutputCacheAttribute : ActionFilterAttribute
    {
        Temps de cache/seconde
        Private Int _timespan ;
        Temps de cache client par seconde
        Private Int _clientTimeSpan ;
        Qu’il soit mis en cache par des utilisateurs anonymes
        Private Bool _anonymousOnly ;
        Mettre en cache la clé d’index
        _cachekey de chaînes privées ;
        Entrepôts de cache
        Objet Cache en lecture seule statique privé WebApiCache = MémoireCache.Par défaut ;


        public WebApiOutputCacheAttribute(int timespan, int clientTimeSpan, bool anonymousOnly)
        {
          _timespan = durée ;
          _clientTimeSpan = tempstempsÉtendue ;
          _anonymousOnly = anonymeUniquement ;
        }

//是否缓存
        bool privé _isCacheable(HttpActionContext ac)
        {
             si (_timespan > 0 & _clientTimeSpan > 0)
             {
                si (_anonymousOnly)
                   if (Thread.CurrentPrincipal.Identity.IsAuthenticated)
                         return false ;
               if (ac. Request.Method == HttpMethod.Get) return true ;
            }
           sinon
           {
                lancer un nouveau InvalidOperationException (« Mauvais Arguments » ») ;
           }
            return false ;
        }

        private CacheControlHeaderValue setClientCache()
        {
            var cachecontrol = new CacheControlHeaderValue() ;
            Contrôle de cache. ÂgeMaximal = TempsPériode. DeSecondes(_clientTimeSpan) ;
            Contrôle de cache. MustRevalider = vrai ;
            return cachecontrol ;
        }


//Action调用前执行的方法
        public override void OnActionExecuting(HttpActionContext ac)
        {
            si (ac != nulle)
            {
                if (_isCacheable(ac))
                {
                    _cachekey = ficelle. Join(« : », nouvelle chaîne[] { ac. Request.RequestUri.AbsolutePath, ac. Request.Headers.Accept.FirstOrDefault(). ToString() }) ;
                    if (WebApiCache.Contains(_cachekey))
                    {
                        var val = (chaîne)WebApiCache.Get(_cachekey) ;
                        si (val != nulle)
                        {
                            AC. Réponse = ac. Request.CreateResponse() ;
                            AC. Response.Content = nouvelle StringContent(val) ;
                            var contenttype = (MediaTypeHeaderValue)WebApiCache.Get(_cachekey + « :response-ct ») ;
                            if (contenttype == null)
                                contenttype = nouveau MédiaTypeHeaderValue(_cachekey. Split(' :')[1]) ;
                            AC. Response.Content.Headers.ContentType = contenttype ;
                            AC. Response.Headers.CacheControl = setClientCache() ;
                            retour ;
                        }
                    }
                }
            }
            sinon
            {
                lancer un nouveau ArgumentNullException (« actionContext ») ;
            }
        }


//Action调用后执行方法
        public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
        {
            si ( !( WebApiCache.Contains(_cachekey)))
            {
                var body = actionExecutedContext.Response.Content.ReadAsStringAsync(). Résultat ;
                WebApiCache.Add(_cachekey, corps, DateTime.Now.AddSeconds(_timespan)) ;
                WebApiCache.Add(_cachekey + « :response-ct », actionExecutedContext.Response.Content.Headers.ContentType, DateTime.Now.AddSeconds(_timespan)) ;
            }
            if (_isCacheable(actionExécutedContext.ActionContext))
                actionExecutedContext.ActionContext.Response.Headers.CacheControl = setClientCache() ;
        }

    }

3. Le contrôleur doit ajouter le cache à la méthode Get pour ajouter le filtre

     [WebApiOutputCache(120,60,false)]
        chaîne publique GetShoppingCart()
        {
            retour « Hello World » ;
        }
Commencez, observez le point d’arrêt, et observez l’effet. Le processus entier est : initialiser le filtre de cache au démarrage, puis appeler la méthode Get avec le filtre ajouté, entrer dans la méthode OnActionExecuting, déterminer s’il existe un cache pertinent, s’il y en a un, retourner le résultat directement, sinon appeler l’Action du contrôleur, puis appeler la méthode OnActionExecuted pour ajouter la paire clé cache-valeur pertinente et définir le temps d’expiration du cache pour retourner le résultat.




Précédent:Désinstaller l’outil d’application redondante Win10
Prochain:« CSS World » par Zhang Xinxu azw3+mobi+epub
Publié sur 19/01/2019 09:09:45 |
Bien
Démenti:
Tous les logiciels, supports de programmation ou articles publiés par Code Farmer Network sont uniquement destinés à l’apprentissage et à la recherche ; Le contenu ci-dessus ne doit pas être utilisé à des fins commerciales ou illégales, sinon les utilisateurs assumeront toutes les conséquences. Les informations sur ce site proviennent d’Internet, et les litiges de droits d’auteur n’ont rien à voir avec ce site. Vous devez supprimer complètement le contenu ci-dessus de votre ordinateur dans les 24 heures suivant le téléchargement. Si vous aimez le programme, merci de soutenir un logiciel authentique, d’acheter l’immatriculation et d’obtenir de meilleurs services authentiques. En cas d’infraction, veuillez nous contacter par e-mail.

Mail To:help@itsvse.com