仮想パスプロバイダを使用して、特定の拡張機能のファイルシステムから項目を取得しています。ベースの実装は、次のCacheDependencyがロード中のキャッシュを破棄していない(仮想パスプロバイダを使用)
if (Handler != null)
{
return new MyCacheDependency(virtualPath, virtualPathDependencies, utcStart);
}
else
{
return Previous.GetCacheDependency(virtualPath, virtualPathDependencies, utcStart);
}
MyCacheDependencyは、対応するCacheItemRemovedCallback
CacheItemRemovedCallback onCacheItemRemoved = new CacheItemRemovedCallback(this.MyCacheItemRemovedCallbackMethod);
lock (_cache)
{
_cache.Insert(key, value, new CacheDependency(virtualPath), DateTime.Now.AddMinutes(5), Cache.NoSlidingExpiration, System.Web.Caching.CacheItemPriority.Default, onCacheItemRemoved);
}
MyCacheItemRemovedCallbackMethodの私の実装があるが
// I did read that this needs to be a static implementation and thread-safe too
public void MyCacheItemRemovedCallbackMethod(string key, object value, CacheItemRemovedReason reason)
{
this.SetUtcLastModified(DateTime.UtcNow);
this.Invalidate();
cacheRemoveReason = reason;
switch (cacheRemoveReason.ToString())
{
case dependencyChanged:
{
// what should be disposed here?
this.CacheDependencyDispose();
this.Dispose();
break;
}
case expired:
{
// what should be disposed here?
this.CacheDependencyDispose();
this.Dispose();
break;
}
case removed:
{
// what should be disposed here?
this.CacheDependencyDispose();
this.Dispose();
break;
}
default:
this.CacheDependencyDispose();
this.Dispose();
break;
}
}
でHttpContext.Current.Cacheオブジェクト上で次のインサートを使用して返すん
上記はほとんどの環境でチャームのように動作しますが、システムに負荷がかかると、キャッシュはn正しく追い出されている。
問題
この項目は、ファイルシステムに更新されていると同時に、複数の要求がある場合には、重い負荷の下で、たまたまは、リソースに送信します。私はまだキャッシュが削除されていると仮定していますが、私たちのアプリケーションで古いコンテンツを引き続き見ることができます。
ロードが解放されてから期限切れになっても、削除されたユースケースが呼び出されることがわかりました。また、ログにmycallbackメソッドが正しく呼び出されているのを見ることもできますが、Webページはファイルシステムから最新の内容を取得していません。
メモリを解放するために削除が実行されている場合、最新のcache.insertはキャッシュを正しく更新していません。
提案/フィードバック
- は私が 上記の各シナリオで正しく特定の依存関係を配置しませんよ?どんなフィードバックもありがとうございます。
- この問題の原因となっている仮想パスプロバイダの設定がありません。
- を有効または無効にする必要があるアプリケーションまたはページレベルの設定はありますか?
- 私が紛失している他のアイテムはありますか?
アップデート:私の無効化はNotifyDependencyChanged
base.NotifyDependencyChanged(this, EventArgs.Empty);