1. Nugetが該当するDLLをインストールする
Web API 2 : Install-Package Strathweb.CacheOutput.WebApi2 Web API 1 : Install-Package Strathweb.CacheOutput
2。 新しいActionFilterAttributeを作成し、関連するメソッドを上書きします
public class WebApiOutputCacheAttribute : ActionFilterAttribute { キャッシュ時間/秒 プライベート・インタレント_timespan; クライアントキャッシュの時間/秒 プライベート・イン_clientTimeSpan; 匿名ユーザーによってキャッシュされているかどうか プライベート・ブール_anonymousOnly; インデックスキーをキャッシュする プライベートストリング_cachekey; キャッシュ倉庫 プライベート静的読み取り専用 ObjectCache WebApiCache = MemoryCache.Default;
public WebApiOutputCacheAttribute(int timespan, int clientTimeSpan, bool anonymousOnly) { _timespan = 時間帯; _clientTimeSpan = clientTimeSpan; _anonymousOnly = 匿名のみ; }
//是否缓存 private bool _isCacheable(HttpActionContext ac) { もし(_timespan > 0 & & _clientTimeSpan > 0) { もし(_anonymousOnly) if(Thread.CurrentPrincipal.Identity.IsAuthenticated) Return false; もし(ac. Request.Method == HttpMethod.Get) true を返します; } そうでなければ { 新しいInvalidOperationException("Wrong Arguments"); } Return false; }
private CacheControlHeaderValue setClientCache() { var cachecontrol = new CacheControlHeaderValue(); キャッシュコントロール。 MaxAge = TimeSpan.FromSeconds(_clientTimeSpan); キャッシュコントロール。 MustRevalidate = true; Return CacheControl; }
//Action调用前执行的方法 パブリックオーバーライド void OnActionExecuting(HttpActionContext ac) { もし(ac != null)ならば { もし (_isCacheable(ac)) { _cachekey = 文字列。 Join(":", 新しい文字列[] { ac. リクエスト。リクエスト。Uri.AbsolutePath, ac. Request.Headers.Accept.FirstOrDefault()。 ToString() }); if (WebApiCache.Contains(_cachekey)) { var val = (string)WebApiCache.Get(_cachekey); もし(val != null)ならば { エアコン。 応答 = ac。 Request.CreateResponse(); エアコン。 Response.Content = new StringContent(val); var contenttype = (MediaTypeHeaderValue)WebApiCache.Get(_cachekey + ":response-ct"); もし(contenttype == null) contenttype = new MediaTypeHeaderValue(_cachekey。 Split(':')[1]); エアコン。 Response.Content.Headers.ContentType = contentType; エアコン。 Response.Headers.CacheControl = setClientCache(); 帰還; } } } } そうでなければ { 新しいArgumentNullException("actionContext"); } }
//Action调用后执行方法 public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext) { もし(!( WebApiCache.Contains(_cachekey))) { var body = actionExecutedContext.Response.Content.ReadAsStringAsync(). 結果; WebApiCache.Add(_cachekey、本文、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. コントローラがキャッシュをGetメソッドに追加してフィルターを追加する必要があります
[WebApiOutputCache(120,60,false)] パブリック文字列 GetShoppingCart() { 「Hello World」を返す。 } 始めて、ブレークポイントを観察し、効果を観察します。 全体のプロセスは、起動時にキャッシュフィルターを初期化し、フィルターを追加したGetメソッドを呼び出し、OnActionExecutingメソッドを入力し、関連するキャッシュがあるかどうかを確認し、存在すれば結果を直接返します。なければコントローラーのActionを呼び出し、OnActionExecutedメソッドを呼び出して関連するキャッシュのキー-値ペアを追加し、キャッシュの有効期限を設定して結果を返します。 |