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. |