web-dev-qa-db-ja.com

ASP.NET MVC出力キャッシュの一部を「無効化」するにはどうすればよいですか?

ASP.NET MVC出力キャッシュの一部をプログラムで無効にする方法はありますか?私ができるようにしたいのは、ユーザーがキャッシュされたアクションから返されるものを変更するデータを投稿した場合、そのキャッシュされたデータを無効にできることです。

これも可能ですか?

46
Matthew Belk

1つの方法は、次の方法を使用することです。

HttpResponse.RemoveOutputCacheItem("/Home/About");

別の方法はここで説明されています: http://aspalliance.com/668

必要なすべてのアクションにメソッドレベル属性を使用し、それにキーを表す文字列を追加するだけで、2番目のメソッドを実装できると思います。それは私があなたの質問を理解した場合です。

編集:はい、asp.net mvcOutputCacheは単なるラッパーです。

varyByParam="none"を使用している場合は、"/Statistics"を無効にするだけです。これは<id1>/<id2>がクエリ文字列値の場合です。これにより、ページのすべてのバージョンが無効になります。

簡単なテストを行いました。varyByParam="id1"を追加してからページの複数のバージョンを作成すると、invalidate invalidate "/Statistics/id1"と言うと、そのバージョンだけが無効になります。ただし、さらにテストを行う必要があります。

39
sirrocco

キャッシュについてテストを行いました。これは私が見つけたものです:

アクションにつながるすべてのルートのキャッシュをクリアする必要があります。コントローラでまったく同じアクションにつながる3つのルートがある場合、ルートごとに1つのキャッシュがあります。

たとえば、次のルート設定があります。

routes.MapRoute(
                name: "config1",
                url: "c/{id}",
                defaults: new { controller = "myController", action = "myAction", id = UrlParameter.Optional }
                );

            routes.MapRoute(
                name: "Defaultuser",
                url: "u/{user}/{controller}/{action}/{id}",
                defaults: new { controller = "Accueil", action = "Index", user = 0, id = UrlParameter.Optional }
            );

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Accueil", action = "Index", id = UrlParameter.Optional }
            );

次に、これらの3つのルートは、パラメータmyActionを使用してmyControllermyParamにつながります。

  1. http://example.com/c/myParam
  2. http://example.com/myController/myAction/myParam
  3. http://example.com/u/0/myController/myAction/myParam

私の行動が次の場合

public class SiteController : ControllerCommon
    {

        [OutputCache(Duration = 86400, VaryByParam = "id")]
        public ActionResult Cabinet(string id)
        {
             return View();
}
}

ルートごとに1つのキャッシュ(この場合は3)があります。したがって、すべてのルートを無効にする必要があります。

このような

private void InvalidateCache(string id)
        {
            var urlToRemove = Url.Action("myAction", "myController", new { id});
            //this will always clear the cache as the route config will create the path
            Response.RemoveOutputCacheItem(urlToRemove);
            Response.RemoveOutputCacheItem(string.Format("/myController/myAction/{0}", id));
            Response.RemoveOutputCacheItem(string.Format("/u/0/myController/myAction/{0}", id));
        }
1
Daniel