1. Nuget installiert die entsprechende DLL
Web API 2 : Install-Package Strathweb.CacheOutput.WebApi2 Web API 1 : Install-Package Strathweb.CacheOutput
Zwei. Erstelle ein neues ActionFilterAttribut und überschreibe die zugehörigen Methoden
öffentliche Klasse WebApiOutputCacheAttribute : ActionFilterAttribute { Cache-Zeit/Sekunde Private Int _timespan; Client Cache time/sec Private Int _clientTimeSpan; Ob es von anonymen Nutzern zwischengespeichert wird Private Bool _anonymousOnly; Cache den Indexschlüssel Privatsaiten-_cachekey; Cache-Lagerhäuser privater statischer Readonly-ObjectCache WebApiCache = MemoryCache.Default;
public WebApiOutputCacheAttribute(int timespan, int clientTimeSpan, bool anonymousOnly) { _timespan = Zeitspanne; _clientTimeSpan = clientTimeSpan; _anonymousOnly = anonymNur; }
//是否缓存 private bool _isCacheable(HttpActionContext ac) { if (_timespan > 0 & _clientTimeSpan > 0) { wenn (_anonymousOnly) if (Thread.CurrentPrincipal.Identity.IsAuthenticated) return false; wenn (ac. Request.Method == HttpMethod.Get) return true; } oder { neue InvalidOperationException ("Falsche Argumente") werfen); } return false; }
private CacheControlHeaderValue setClientCache() { var cachecontrol = neuer CacheControlHeaderValue(); Cachecontrol. MaxAge = TimeSpan.FromSeconds(_clientTimeSpan); Cachecontrol. MustRevalidate = wahr; Cachecontrol zurückzugeben; }
//Action调用前执行的方法 public override void OnActionExecuting(HttpActionContext ac) { wenn (ac != null) { wenn (_isCacheable(ac)) { _cachekey = Schnur. Join(":", neue Saite[] { ac. Request.RequestUri.AbsolutePath, AC. Request.Headers.Accept.FirstOrDefault(). ToString() }); if (WebApiCache.Contains(_cachekey)) { var val = (string)WebApiCache.Get(_cachekey); wenn (val != null) { AC. Antwort = AC. Request.CreateResponse(); AC. Response.Content = neuer StringContent(val); var contenttype = (MediaTypeHeaderValue)WebApiCache.Get(_cachekey + ":response-ct"); wenn (contenttype == null) contenttype = neuer MediaTypeHeaderValue(_cachekey. Split(':')[1]); AC. Response.Content.Headers.ContentType = contenttype; AC. Response.Headers.CacheControl = setClientCache(); Rückgabe; } } } } oder { neue ArgumentNullException ("actionContext") werfen; } }
//Action调用后执行方法 public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext) { wenn (!( WebApiCache.Contains(_cachekey))) { var body = actionExecutedContext.Response.Content.ReadAsStringAsync(). Ergebnis; WebApiCache.Add(_cachekey, body, DateTime.Now.AddSeconds(_timespan)); WebApiCache.Add(_cachekey + ":response-ct", actionExecutedContext.Response.Content.Headers.ContentType, DateTime.Now.AddSeconds(_timespan)); } wenn (_isCacheable(actionExecutedContext.ActionContext)) actionExecutedContext.ActionContext.Response.Headers.CacheControl = setClientCache(); }
}
3. Der Controller muss den Cache zur Get-Methode hinzufügen, um den Filter hinzuzufügen
[WebApiOutputCache(120,60,false)] öffentliche Zeichenkette GetShoppingCart() { "Hello World" zurückkehren; } Beginne, beobachte den Breakpoint und beobachte den Effekt. Der gesamte Prozess besteht darin: Initialisieren Sie den Cache-Filter beim Start und rufen Sie dann die Get-Methode mit hinzugefügtem Filter auf, geben Sie die OnActionExecuting-Methode ein, bestimmen, ob es einen relevanten Cache gibt, falls ja, geben Sie das Ergebnis direkt zurück, wenn nicht, rufen Sie die Aktion des Controllers auf und rufen dann die OnActionExekutiv-Methode auf, um das entsprechende Cache-Schlüssel-Wert-Paar hinzuzufügen und die Cache-Verfallszeit so einzustellen, dass sie das Ergebnis zurückgibt. |