簡単なことをやろうとしていますが、答えが見つかりません。アプリケーション レベル (Web サイトの場合) でキャッシュを削除する方法を知っています。
しかし、webrole の開始時に、azure appfabric キャッシュのすべてのキャッシュをクリアする必要があります。
編集:それができるとしたら?Azure Asp.net 共有キャッシュの重大な誤動作を考えているのですか、それとも私はばかですか?
これは私が立ち往生しているシナリオです:
- 私はいくつかの異なるWebサイトを持つWebRoleを持っています
- 私のすべての Web サイトの各ルートに default.aspx ファイルがあり、60 分のキャッシュがあると考えてください。
- それらを閲覧すると、いくつかのキャッシュされたページが appfabric キャッシュに 60 分間保存されます。
- この展開キャッシュの依存関係が「E:\sitesroot\xx」のようなパスに作成されていることを考慮してください。
- その間に、Webrole をリセットするか、新しいデプロイをアップロードします
- ここで、新しく作成されたインスタンスの Web サイトが次のパスを持っていると考えてください: 'F:\sitesroot\xx'
- あなたはそれを得る、heres私が持っている結果:
ディレクトリ 'E:\sitesroot\12' は存在しません。ファイル変更の監視を開始できませんでした。
System.Web.HttpException (0x80070003): Directory 'E:\sitesroot\12' does not exist. Failed to start monitoring file changes.
at System.Web.FileChangesMonitor.FindDirectoryMonitor(String dir, Boolean addIfNotFound, Boolean throwOnError)
at System.Web.FileChangesMonitor.StartMonitoringPath(String alias, FileChangeEventHandler callback, FileAttributesData& fad)
at System.Web.Caching.CacheDependency.Init(Boolean isPublic, String[] filenamesArg, String[] cachekeysArg, CacheDependency dependency, DateTime utcStart)
at System.Web.Caching.CacheDependency..ctor(Int32 dummy, String[] filenames)
at System.Web.Caching.OutputCache.HasDependencyChanged(Boolean isFragment, String depKey, String[] fileDeps, String kernelKey, String oceKey, String providerName)
at System.Web.Caching.OutputCache.Get(String key)
at System.Web.Caching.OutputCacheModule.OnEnter(Object source, EventArgs eventArgs)
at System.Web.HttpApplication.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)
現在の appfacbric キャッシュがハード パス「E:\sitesroot\」のキャッシュ依存性に依存しているため、この問題が発生する可能性があることを理解するのに少し時間がかかりました。このパスが変更された場合はどうでしょうか。
それで、なにかお手伝いできますか ?ここで迷子になりました。Global.asax Application_Start で appcache をクリアしようとしましたが、うまくいかないようです (なぜうまくいかないのかわかりません)。
各Webサイトのキャッシュをクリアするコードは次のとおりです Global.asax Application_Start
Public Shared Sub cacheClear()
Dim keys As New List(Of String)()
' retrieve application Cache enumerator
Dim enumerator As IDictionaryEnumerator = HttpRuntime.Cache.GetEnumerator()
' copy all keys that currently exist in Cache
While enumerator.MoveNext()
keys.Add(enumerator.Key.ToString())
End While
' delete every key from cache
For i As Integer = 0 To keys.Count - 1
HttpRuntime.Cache.Remove(keys(i))
Next
End Sub
これはトリックを行うはずですが、そうではないようです。
確かに私が見逃しているばかげた点があります。
編集
appfabric の asp.net outputcache プロバイダーを完全に削除し、appfabric を使用してカスタム キャッシュを作成しました。うまく機能し、数行のコードと azure へのキャッシュ依存性が簡単になりました。