しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

ASP.NET MVC でブラウザにページをキャッシュさせない方法

ASP.NET MVC には OutputCache 属性が用意されているので、多少は Cache-Control ヘッダを弄ることが出来ます。

[OutputCache(Location = OutputCacheLocation.None, NoStore = true)]
public ActionResult Index()
{
    return View();
}

しかし、OutputCache 属性では no-cache と no-store しか出力されないので、ブラウザの戻るなどを使った場合にはキャッシュ済みのページが表示されてしまいます。

f:id:shiba-yan:20130317151739p:plain

この挙動はログイン・ログアウト周りで割と困ります。なので、クライアント側でキャッシュさせないための属性を作りました。

public class NoClientCacheAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var response = filterContext.HttpContext.Response;

        response.ClearHeaders();

        response.AppendHeader("Cache-Control", "private, no-cache, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0");
        response.AppendHeader("Pragma", "no-cache");
        response.AppendHeader("Expires", "-1");
    }
}

AppendHeader する前に ClearHeaders を読んでいるのがミソです。これをしないとデフォルトのヘッダしか出なくて悩みました。

実際に F12 開発者ツールで確認してみました。

f:id:shiba-yan:20130317151105p:plain

Cache-Control ヘッダにしっかりといろんな値が出力されています。

これで常にサーバへ有効かどうかをチェックするようになるので、戻るボタンで古い画面が表示されることが無くなりました。