我正在尝试做一件简单的事情,但我找不到答案。我知道如何删除应用程序级别的缓存(对于网站)。
但是我需要在 webrole 启动时清除我的 azure appfabric 缓存的所有缓存。
编辑:如果可以做到呢?考虑到 Azure Asp.net 共享缓存中的严重故障,还是我很笨?
这是我陷入的场景:
- 我有一个 WebRole,其中有几个不同的网站
- 考虑我所有的网站在每个根目录上都有一个 default.aspx 文件,缓存时间为 60 分钟,这是普通的 <%@ OutputCache Duration="3600" VaryByParam="*" %>,没有花哨的代码
- 我浏览它们,因此几个缓存页面在 appfabric 缓存中存储了 60 分钟
- 考虑在这个部署的底层缓存依赖是在像“E:\sitesroot\xx”这样的路径上创建的
- 在这两者之间,我的 Webrole 重置或我上传了一个新的部署
- 现在考虑我在新创建的实例中的网站有这个路径:'F:\sitesroot\xx'
- 你明白了,这是我得到的结果:
目录“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,但这似乎不起作用(我不明白为什么它不起作用)。
这是我在每个网站 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 的缓存依赖变得容易。