私のブログでは、出力キャッシュを使用して、特定の投稿のキャッシュ バージョンを約 10 分間保存したいと考えていますが、それで問題ありません...
<%@OutputCache Duration="600" VaryByParam="*" %>
しかし、誰かがコメントを投稿したら、キャッシュをクリアして、ページが更新され、コメントが表示されるようにしたい.
ASP.Net C# でこれを行うにはどうすればよいですか?
私のブログでは、出力キャッシュを使用して、特定の投稿のキャッシュ バージョンを約 10 分間保存したいと考えていますが、それで問題ありません...
<%@OutputCache Duration="600" VaryByParam="*" %>
しかし、誰かがコメントを投稿したら、キャッシュをクリアして、ページが更新され、コメントが表示されるようにしたい.
ASP.Net C# でこれを行うにはどうすればよいですか?
私が探していた答えを見つけました:
HttpResponse.RemoveOutputCacheItem("/caching/CacheForever.aspx");
キャッシュをクリアしたいページがわかっている場合は、上記で問題ありません。私のインスタンス (ASP.NET MVC) では、どこからでも同じデータを参照しました。したがって、[保存] を実行したときに、サイト全体のキャッシュをクリアしたかったのです。これは私のために働いたものです:http://aspalliance.com/668
これは、OnActionExecuting フィルターのコンテキストで行われます。BaseController などで OnActionExecuting をオーバーライドすることで、同じように簡単に実行できます。
HttpContextBase httpContext = filterContext.HttpContext;
httpContext.Response.AddCacheItemDependency("Pages");
設定:
protected void Application_Start()
{
HttpRuntime.Cache.Insert("Pages", DateTime.Now);
}
微調整: 「フラッシュ メッセージ」(エラー メッセージ、成功メッセージ - 「このアイテムは正常に保存されました」など) を追加するヘルパーがあります。後続のすべての GET でフラッシュ メッセージが表示されないようにするために、フラッシュ メッセージを書き込んだ後に無効にする必要がありました。
キャッシュのクリア:
HttpRuntime.Cache.Insert("Pages", DateTime.Now);
お役に立てれば。
マスター ページの読み込みイベントでは、次のように記述してください。
Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(-1));
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetNoStore();
ログアウトボタンで次のようにクリックします。
Session.Abandon();
Session.Clear();
投稿テーブルでsqlcachedependencyを使用してみませんか?
このように、カスタムキャッシュクリアコードを実装せず、データベース内のコンテンツが変更されたときにキャッシュを更新するだけですか?
うーん。OutputCache アイテムに VaryByCustom 属性を指定できます。この値は、global.asax で実装できる GetVaryByCustomString メソッドにパラメーターとして渡されます。このメソッドによって返される値は、キャッシュされた項目へのインデックスとして使用されます。たとえば、ページのコメント数を返す場合、コメントが追加されるたびに新しいページがキャッシュされます。
これに対する注意点は、これは実際にはキャッシュをクリアしないということです。ブログ エントリのコメントが頻繁に使用される場合、この方法ではキャッシュのサイズが爆発的に増加する可能性があります。
または、ページの変更不可能な部分 (ナビゲーション、広告、実際のブログ エントリ) をユーザー コントロールとして実装し、それらの各ユーザー コントロールに部分的なページ キャッシュを実装することもできます。
「*」をキャッシュがオンになるパラメータ (PostID?) だけに変更すると、次のようなことができます。
//add dependency
string key = "post.aspx?id=" + PostID.ToString();
Cache[key] = new object();
Response.AddCacheItemDependency(key);
誰かがコメントを追加すると...
Cache.Remove(key);
すべてのリクエストが同じキャッシュ依存関係に関連付けられるため、これは VaryByParam * でも機能すると思います。
HttpRuntime.Close()
..私はすべての方法を試しましたが、これが私にとって唯一の方法です