ASP.NET MVC には OutputCache 属性が用意されているので、多少は Cache-Control ヘッダを弄ることが出来ます。
[OutputCache(Location = OutputCacheLocation.None, NoStore = true)] public ActionResult Index() { return View(); }
しかし、OutputCache 属性では no-cache と no-store しか出力されないので、ブラウザの戻るなどを使った場合にはキャッシュ済みのページが表示されてしまいます。
この挙動はログイン・ログアウト周りで割と困ります。なので、クライアント側でキャッシュさせないための属性を作りました。
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 開発者ツールで確認してみました。
Cache-Control ヘッダにしっかりといろんな値が出力されています。
これで常にサーバへ有効かどうかをチェックするようになるので、戻るボタンで古い画面が表示されることが無くなりました。