web-dev-qa-db-ja.com

コントローラからキャッシュデータ[OutputCache]を無効にする方法は?

ASP.Net MVC 3を使用しています。出力を属性[OutputCache]を使用してキャッシュするコントローラーがあります。

[OutputCache]
public controllerA(){}

特定のコントローラーのキャッシュデータ(サーバーキャッシュ)または一般的にすべてのキャッシュデータを別のコントローラーを呼び出すことで無効にできるかどうか知りたい

public controllerB(){} // Calling this invalidates the cache
38
GibboK

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を想定しているため、コントローラーではなくキャッシュされたアクションごとに無効にする必要があります。

58
Darin Dimitrov

次のように、カスタム属性を使用してそれを行うことができます。

[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
{
}
1
mattytommo