WebAPI2を使用してRESTサービスを実装しました。これは、サービスにアクセスしている異なるクライアントによって作成され結合された異なるセッションを管理するために実装されたサービスです。ASP.NET WebApi2でキャッシュを管理する方法は?
セッションには、アプリケーション機能のアクセスに関する情報と、同じセッションに参加した参加者の情報が含まれています。
各クライアントは、毎秒同期目的でサーバからセッション情報とアクセスリストを取得します。アクセスが変更されると、クライアントの機能が変更されます(有効/無効)。
私はMemoryCacheクラスを使用して、以下のようにWebAPIサービスにセッション情報を保存しています。
public static class SessionManager{
private static object objForLock = new object();
public static List<Session> SessionCollection
{
get
{
lock (objForLock)
{
MemoryCache memoryCache = MemoryCache.Default;
return memoryCache.Get("SessionCollection") as List<Session>;
// return HttpContext.Current.Application["SessionCollection"] as List<Session>;
}
}
set
{
lock (objForLock)
{
MemoryCache memoryCache = MemoryCache.Default;
memoryCache.Add("SessionCollection", value, DateTimeOffset.UtcNow.AddHours(5));
//HttpContext.Current.Application["SessionCollection"] = value;
}
}
}
}
私の問題は、キャッシュの一貫性のない動作に関してれます。
クライアントが同期呼び出しを送信すると、矛盾した結果が返されます。いくつかの要求では、クライアントは適切なデータを取得し、一部の要求ではクライアントはいくつかの要求の後で代替データを取得します。
私はデバッガを追加し、ヌル結果のオブジェクトを監視した後、"memoryCache.Get(" SessionCollection ")"もnullです。いくつかの連続したリクエストの後、再び適切になります。なぜこのオブジェクトが永続的ではないのか分かりません。
代わりに、私は"HttpContext.Current.Application [" SessionCollection "]"も試してみましたが、同じ問題があります。
私は「アプリプールリサイクル」について読んだことがあります。微粒子の時間の後にすべてのキャッシュをリサイクルします。キャッシュされたオブジェクトがアプリケーションプールのリサイクルによってリサイクルされている場合は、どうすればこのオブジェクトを再度取得できますか?
ご迷惑をおかけして申し訳ございません。前もって感謝します。
あなたのサーバーの時刻もUTCに設定されていることを二重チェックしたいだけです。あなたがそれを期待する前にタイムアウト値が実際に打っている可能性はありますか? – ManOVision
Btw、MemoryCacheはスレッドセーフなので、ロックは必要ありません。 –
。NETバージョンを使用していますか? – RAM