キャッシュとブラウザの戻るボタンに対処する最善の方法は何ですか?
-
09-06-2019 - |
質問
asp.net アプリ内にアイテムがキャッシュされているページにユーザーが戻ってきた場合に対処する最善の方法は何ですか?「戻る」ボタン (イベント?) をキャプチャし、そのようにキャッシュを処理する良い方法はありますか?
解決
を使用してみることができます HttpResponse.Cache プロパティ それが役立つなら:
Response.Cache.SetExpires(DateTime.Now.AddSeconds(60));
Response.Cache.SetCacheability(HttpCacheability.Public);
Response.Cache.SetValidUntilExpires(false);
Response.Cache.VaryByParams["Category"] = true;
if (Response.Cache.VaryByParams["Category"])
{
//...
}
または、ページのキャッシュを完全にブロックすることもできます HttpResponse.CacheControl, ですが、上記の Cache プロパティが優先されるため、非推奨になりました。
Response.CacheControl = "No-Cache";
編集:あるいは、本当にできる 怒る そしてそれをすべて手作業で行います。
Response.ClearHeaders();
Response.AppendHeader("Cache-Control", "no-cache"); //HTTP 1.1
Response.AppendHeader("Cache-Control", "private"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "no-store"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "must-revalidate"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "max-stale=0"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "post-check=0"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "pre-check=0"); // HTTP 1.1
Response.AppendHeader("Pragma", "no-cache"); // HTTP 1.1
Response.AppendHeader("Keep-Alive", "timeout=3, max=993"); // HTTP 1.1
Response.AppendHeader("Expires", "Mon, 26 Jul 1997 05:00:00 GMT"); // HTTP 1.1
他のヒント
私が知る限り (または少なくとも読んだことがある限り)、ユーザー イベントに応答して動作するのではなく、「ページ内で」考えるのが最善です。
「戻る」ボタンが押されたかどうかを気にしないようにアプリケーションを設計してください。それだけで対処してくれますよ。。これは、開発の観点からは少し余分な作業を意味するかもしれませんが、全体的にはアプリケーションをより堅牢にするでしょう。
つまり、ステップ 3 でデータ変更が行われた場合、ユーザーがクリックして (ステップ 2 に) 戻り、もう一度 [次へ] をクリックすると、アプリケーションは変更が行われたかどうかを確認します。あるいは理想的には、何も生み出さない 難しい ユーザーが最後に「OK」をクリックするまで変更されます。こうすることで、すべての変更が保存され、ロード時に毎回、以前に入力した値に基づいてフォームに再入力できます。
それが理にかなっているといいのですが:)
RFC 2616 §13.13 そう言う 履歴とキャッシュは別のものです. 。キャッシュが「戻る」ボタンに影響を与えることは絶対にありません。
HTTP ヘッダーの組み合わせが「戻る」ボタンに影響を与える場合、それはブラウザーのバグです…1 つの例外を除きます。
HTTP でS ブラウザが解釈する Cache-control: must-revalidate
[戻る] ボタンが使用されたときにページを更新する要求として使用します (Mozilla ではこれを「愚かなバンク モード」と呼んでいます)。これはプレーン HTTP ではサポートされていません。
これに対処する最善の方法は、ASP.NET ページ (マスター ページを使用している場合はマスター ページ) にキャッシュなしディレクティブを置くことです。ASP.NET コードでこれに直接対処する方法はないと思います (キャッシュの決定はクライアントで行われるため)。
MVC については、(Web フォームベースの ASP.NET とは異なると仮定して) どうやってそれを実現するのかわかりません。使ったことがないんです。
次のコードは、IE9+、FF21、および最新の Chrome で機能しました。
Response.Cache.SetCacheability(HttpCacheability.NoCache | HttpCacheability.Private);
Response.Cache.AppendCacheExtension("must-revalidate");
Response.Cache.AppendCacheExtension("max-age=0");
Response.Cache.SetNoStore();
これを置くことができます Page_Load()
MasterPage のイベント ハンドラーを使用して、戻るボタンを押したときにアプリ内のすべてのページでサーバーへの往復が必要になるようにします。