特定のユーザーコンテキストだけでなく、すべてのユーザーがアクセスできるASP.NETでキャッシュを使用するにはどうすればよいですか?ユーザーがブラウザウィンドウを閉じるか、(セッションオブジェクトのように)期限切れになると、このキャッシュの特定のキーが自動的に削除されますか?
2 に答える
キャッシュにはすべてのユーザーがアクセスできます。一定期間後に有効期限が切れるように設定できます。
Cache.Insert("key", myTimeSensitiveData, null,
DateTime.Now.AddMinutes(1), TimeSpan.Zero);
global.asax のセッション終了イベントを実装することにより、セッションの有効期限が切れるたびにキャッシュ エントリを削除できます。
void Session_End(Object sender, EventArgs E)
{
Cache.Remove("MyData1");
}
キャッシュの詳細については、こちらを参照してください
編集済み: ユーザーがブラウザを閉じたときの反応方法に関する質問については、これは簡単ではないと思います。「アンロード」イベントを処理するためにクライアント側で JavaScript を試すこともできますが、ブラウザ/クライアントがクラッシュする可能性があるため、これは信頼できません。私の意見では、「ハートビート」アプローチは機能しますが、追加の努力が必要です。詳細については、この質問を参照してください。
アイテムをキャッシュから削除するには、Session_OnEnd() イベントを使用する必要があります。ただし、ユーザーがブラウザを閉じただけでは、このイベントは発生しません。このイベントは、セッション タイムアウト時にのみ発生します。おそらく、アイテムがすでに削除されているかどうかを確認するチェックを追加する必要があります。
public void Session_OnEnd()
{
// You need some identifier unique to the user's session
if (Cache["userID"] != null)
Cache.Remove("userID");
}
また、キャッシュ内のアイテムをユーザーのセッションの間アクティブなままにしたい場合は、アイテムにスライド有効期限を使用し、リクエストごとに更新する必要があります。これは OnActionExecuted で行います (ASP.NET MVC のみ)。
protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
// Put object back in cache in part to update any changes
// but also to update the sliding expiration
filterContext.HttpContext.Cache.Insert("userID", myObject, null, Cache.NoAbsoluteExpiration,
TimeSpan.FromMinutes(20), CacheItemPriority.Normal, null);
base.OnActionExecuted(filterContext);
}