質問
私のブログでは、出力キャッシュを使用して、特定の投稿のキャッシュされたバージョンを約 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.AddCacheItemDependency を使用してすべての出力キャッシュをクリアします。
public class Page : System.Web.UI.Page
{
protected override void OnLoad(EventArgs e)
{
try
{
string cacheKey = "cacheKey";
object cache = HttpContext.Current.Cache[cacheKey];
if (cache == null)
{
HttpContext.Current.Cache[cacheKey] = DateTime.UtcNow.ToString();
}
Response.AddCacheItemDependency(cacheKey);
}
catch (Exception ex)
{
throw new SystemException(ex.Message);
}
base.OnLoad(e);
}
}
// Clear All OutPutCache Method
public void ClearAllOutPutCache()
{
string cacheKey = "cacheKey";
HttpContext.Cache.Remove(cacheKey);
}
これは、ASP.NET MVC の OutputCachedPage でも使用できます。
マスター ページの読み込みイベントで、次のように記述してください。
Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(-1));
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetNoStore();
そしてログアウトボタンをクリックしてください:
Session.Abandon();
Session.Clear();
ふーむ。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 * を使用しても機能すると思います。
Posts テーブルで sqlcachedependency を使用しないのはなぜですか?
この方法では、カスタムのキャッシュクリアコードを実装せず、データベース内のコンテンツが変更されたときにキャッシュを更新するだけですか?
HttpRuntime.Close()
..すべての方法を試しましたが、これが私にとって唯一うまくいきました