1. Nuget menginstal dll yang relevan
API Web 2 : Instal-Paket Strathweb.CacheOutput.WebApi2 Web API 1 : Install-Package Strathweb.CacheOutput
Dua. Buat ActionFilterAttribute baru dan ganti metode terkait
class publik WebApiOutputCacheAttribute : ActionFilterAttribute { Waktu cache/detik _timespan int pribadi; Waktu cache klien/detik _clientTimeSpan int pribadi; Apakah itu di-cache oleh pengguna anonim bool pribadi _anonymousOnly; Cache kunci indeks _cachekey string pribadi; Gudang cache readonly statis privat ObjectCache WebApiCache = MemoryCache.Default;
publik WebApiOutputCacheAttribute(int timesspan, int clientTimeSpan, bool anonymousOnly) { _timespan = rentang waktu; _clientTimeSpan = klienRentang Waktu; _anonymousOnly = anonimHanya saja; }
//是否缓存 bool pribadi _isCacheable(HttpActionContext ac) { jika (_timespan > 0 && _clientTimeSpan > 0) { jika (_anonymousOnly) if (Thread.CurrentPrincipal.Identity.IsAuthenticated) mengembalikan false; jika (ac. Request.Method == HttpMethod.Get) mengembalikan true; } yang lain { melemparkan InvalidOperationException baru("Argumen yang Salah"); } mengembalikan false; }
CacheControlHeaderValue pribadi setClientCache() { var cachecontrol = CacheControlHeaderValue(); cache. MaxAge = TimeSpan.FromSeconds(_clientTimeSpan); cache. MustRevalidate = true; mengembalikan cachecontrol; }
//Action调用前执行的方法 penggantian publik void OnActionExecuting(HttpActionContext ac) { if (ac != null) { jika (_isCacheable(ac)) { _cachekey = string. Join(":", string baru[] { ac. Request.RequestUri.AbsolutePath, ac. Request.Headers.Accept.FirstOrDefault(). ToString() }); if (WebApiCache.Contains(_cachekey)) { var val = (string)WebApiCache.Get(_cachekey); if (val != null) { AC. Respon = ac. Permintaan.CiptakanTanggapan(); AC. Response.Content = StringContent(val) baru; var contenttype = (MediaTypeHeaderValue)WebApiCache.Get(_cachekey + ":response-ct"); if (contenttype == null) contenttype = MediaTypeHeaderValue(_cachekey baru. Split(':')[1]); AC. Response.Content.Headers.ContentType = tipe konten; AC. Response.Headers.CacheControl = setClientCache(); kembali; } } } } yang lain { melemparkan ArgumentNullException baru("actionContext"); } }
//Action调用后执行方法 penggantian publik void OnActionExecuted(HttpActionExecutedContext actionExecutedContext) { jika (!( WebApiCache.Berisi(_cachekey))) { var body = actionExecutedContext.Response.Content.ReadAsStringAsync(). Hasil; WebApiCache.Add(_cachekey, body, 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. Pengontrol perlu menambahkan cache ke metode Get untuk menambahkan filter
[WebApiOutputCache(120,60,false)] string publik GetShoppingCart() { mengembalikan "Hello World"; } mulai, amati titik henti, dan amati efeknya. Seluruh prosesnya adalah: menginisialisasi filter cache saat startup, lalu memanggil metode Get dengan filter yang ditambahkan, masuk ke metode OnActionExecuting, menentukan apakah ada cache yang relevan, jika ada, kembalikan hasilnya secara langsung, jika tidak, panggil Action's controller, lalu panggil metode OnActionExecuted untuk menambahkan pasangan kunci-nilai cache yang relevan dan atur waktu kedaluwarsa cache untuk mengembalikan hasilnya. |