1. ホーム
  2. c#

[解決済み】ASP.NET MVCで属性を使用して特定のアクションのキャッシュを防止する

2022-04-13 14:53:36

質問

ASP.NET MVC 3アプリケーションを持っています。このアプリケーションは、jQueryを通じてレコードを要求します。jQueryは、JSON形式で結果を返すコントローラのアクションにコールバックします。私はこれを証明することができませんでしたが、私は私のデータがキャッシュされている可能性があることを懸念しています。

すべてのアクションではなく、特定のアクションにのみキャッシュを適用させたいのですが。

データがキャッシュされないようにするために、アクションに付けることができる属性はありますか?そうでない場合、ブラウザがキャッシュされたセットではなく、毎回新しいレコードのセットを取得するようにするにはどうすればよいでしょうか?

どのように解決するのですか?

JQueryが結果をキャッシュしていないことを確認するために、ajaxメソッドに以下を記述してください。

$.ajax({
    cache: false
    //rest of your ajax setup
});

また、MVCでキャッシュを防ぐために、独自の属性を作成しましたが、同じようにすることも可能です。以下は私たちのコードです。

[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);
    }
}

そして、コントローラを [NoCache] . あるいは、このようにコントローラを継承した基底クラスのクラスに属性を設定することもできます。

[NoCache]
public class ControllerBase : Controller, IControllerBase

また、一部のアクションを非キャッシュにする必要がある場合は、 コントローラ全体を装飾するのではなく、この属性で装飾することもできます。

もしあなたのクラスやアクションが NoCache 変更をコンパイルした後、ブラウザで "hard refresh" (Ctrl+F5) を実行する必要があることを忘れないでください。そうしないと、ブラウザはキャッシュされた古いバージョンを保持し、"normal refresh" (F5)では更新されないからです。