ASP.Net MVC 3を使用しています。出力を属性[OutputCache]
を使用してキャッシュするコントローラーがあります。
[OutputCache]
public controllerA(){}
特定のコントローラーのキャッシュデータ(サーバーキャッシュ)または一般的にすべてのキャッシュデータを別のコントローラーを呼び出すことで無効にできるかどうか知りたい
public controllerB(){} // Calling this invalidates the cache
RemoveOutputCacheItem
メソッドを使用できます。
これを使用する方法の例を次に示します。
public class HomeController : Controller
{
[OutputCache(Duration = 60, Location = OutputCacheLocation.Server)]
public ActionResult Index()
{
return Content(DateTime.Now.ToLongTimeString());
}
public ActionResult InvalidateCacheForIndexAction()
{
string path = Url.Action("index");
Response.RemoveOutputCacheItem(path);
return Content("cache invalidated, you could now go back to the index action");
}
}
Indexアクションの応答は、サーバーに1分間キャッシュされます。 InvalidateCacheForIndexAction
アクションを押すと、Indexアクションのキャッシュが期限切れになります。現在、キャッシュ全体を無効にする方法はありません。RemoveOutputCacheItem
メソッドは、キャッシュしたサーバー側スクリプトのURLを想定しているため、コントローラーではなくキャッシュされたアクションごとに無効にする必要があります。
次のように、カスタム属性を使用してそれを行うことができます。
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public sealed class NoCacheAttribute : ActionFilterAttribute
{
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
filterContext.HttpContext.Response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1));
filterContext.HttpContext.Response.Cache.SetValidUntilExpires(false);
filterContext.HttpContext.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
filterContext.HttpContext.Response.Cache.SetNoStore();
base.OnResultExecuting(filterContext);
}
}
次に、controllerb
で次のことができます。
[NoCache]
public class controllerB
{
}