晶莹剔透 :
步骤1
创建一个包含几个网站的 webrole,其中包含一个 default.aspx 文件和一个普通的常规 <%@ OutputCache Duration="3600" VaryByParam="*" %>,在 webconfig 中使用 appfabric 缓存提供程序作为 outputcache 并链接到您的缓存订阅在天蓝色与提供的代码
只使用一个 webrole 实例,启动页面,它会刷新它,重新加载几次,它运行良好
第2步
现在增加到 2 个或更多此 WebRole 的实例
这是我的问题,在客户端重新加载您的 default.aspx 页面,现在取决于 Webrole,负载均衡器将引导您的请求,您可能会收到 System.Web.Caching.CacheDependency 错误,因为 default.aspx 缓存在分布式缓存中似乎是基于文件监控依赖,default.aspx 页面的硬路径,如“E:\sitesroot\2\”。但是您可能(并且确实)在 Webrole 的其他实例上拥有“F:\sitesroot\2\”。
所以它会引发一个错误:
System.Web.HttpException (0x80070003):目录 'E:\sitesroot\2' 不存在。无法开始监控文件更改。
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)
自从一个星期以来,我一直在努力解决这个错误,我不明白,如果有人知道在多个 webroles 实例上实现分布式输出缓存的方法,请分享您的解决方案。
编辑
我结束了完全放弃 appfabric 的 asp.net outputcache 提供程序并使用 appfabric 编写自定义缓存。效果很好,几行代码和对 azure 的缓存依赖变得容易。