51

私のブログでは、出力キャッシュを使用して、特定の投稿のキャッシュ バージョンを約 10 分間保存したいと考えていますが、それで問題ありません...

<%@OutputCache Duration="600" VaryByParam="*" %>

しかし、誰かがコメントを投稿したら、キャッシュをクリアして、ページが更新され、コメントが表示されるようにしたい.

ASP.Net C# でこれを行うにはどうすればよいですか?

4

8 に答える 8

49

私が探していた答えを見つけました:

HttpResponse.RemoveOutputCacheItem("/caching/CacheForever.aspx");
于 2008-08-14T20:04:36.290 に答える
41

キャッシュをクリアしたいページがわかっている場合は、上記で問題ありません。私のインスタンス (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);

お役に立てれば。

于 2010-05-20T18:24:31.887 に答える
3

マスター ページの読み込みイベントでは、次のように記述してください。

Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(-1));
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetNoStore();

ログアウトボタンで次のようにクリックします。

Session.Abandon();
Session.Clear();
于 2011-06-22T12:24:06.220 に答える
1

投稿テーブルでsqlcachedependencyを使用してみませんか?

sqlcachedependency msdn

このように、カスタムキャッシュクリアコードを実装せず、データベース内のコンテンツが変更されたときにキャッシュを更新するだけですか?

于 2010-01-02T00:17:48.347 に答える
1

うーん。OutputCache アイテムに VaryByCustom 属性を指定できます。この値は、global.asax で実装できる GetVaryByCustomString メソッドにパラメーターとして渡されます。このメソッドによって返される値は、キャッシュされた項目へのインデックスとして使用されます。たとえば、ページのコメント数を返す場合、コメントが追加されるたびに新しいページがキャッシュされます。

これに対する注意点は、これは実際にはキャッシュをクリアしないということです。ブログ エントリのコメントが頻繁に使用される場合、この方法ではキャッシュのサイズが爆発的に増加する可能性があります。

または、ページの変更不可能な部分 (ナビゲーション、広告、実際のブログ エントリ) をユーザー コントロールとして実装し、それらの各ユーザー コントロールに部分的なページ キャッシュを実装することもできます。

于 2008-08-14T19:51:50.683 に答える
1

「*」をキャッシュがオンになるパラメータ (PostID?) だけに変更すると、次のようなことができます。

//add dependency
string key = "post.aspx?id=" + PostID.ToString();
Cache[key] = new object();
Response.AddCacheItemDependency(key);

誰かがコメントを追加すると...

Cache.Remove(key);

すべてのリクエストが同じキャッシュ依存関係に関連付けられるため、これは VaryByParam * でも機能すると思います。

于 2008-08-14T19:55:31.847 に答える
-1

HttpRuntime.Close()..私はすべての方法を試しましたが、これが私にとって唯一の方法です

于 2011-01-18T18:55:57.207 に答える