ASP.NET MVC出力キャッシュの一部をプログラムで無効にする方法はありますか?私ができるようにしたいのは、ユーザーがキャッシュされたアクションから返されるものを変更するデータを投稿した場合、そのキャッシュされたデータを無効にできることです。
これも可能ですか?
1つの方法は、次の方法を使用することです。
HttpResponse.RemoveOutputCacheItem("/Home/About");
別の方法はここで説明されています: http://aspalliance.com/668
必要なすべてのアクションにメソッドレベル属性を使用し、それにキーを表す文字列を追加するだけで、2番目のメソッドを実装できると思います。それは私があなたの質問を理解した場合です。
編集:はい、asp.net mvcOutputCacheは単なるラッパーです。
varyByParam="none"
を使用している場合は、"/Statistics"
を無効にするだけです。これは<id1>/<id2>
がクエリ文字列値の場合です。これにより、ページのすべてのバージョンが無効になります。
簡単なテストを行いました。varyByParam="id1"
を追加してからページの複数のバージョンを作成すると、invalidate invalidate "/Statistics/id1"
と言うと、そのバージョンだけが無効になります。ただし、さらにテストを行う必要があります。
キャッシュについてテストを行いました。これは私が見つけたものです:
アクションにつながるすべてのルートのキャッシュをクリアする必要があります。コントローラでまったく同じアクションにつながる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
を使用してmyController
の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));
}