Кэш приложения Azure как поставщик распределенного кэша вывода в нескольких веб-ролях выдает ошибки "Не удалось запустить мониторинг изменений файла"
Кристально чистый:
Шаг 1
Создайте веб-ролик с несколькими веб-сайтами с файлом default.aspx и обычным обычным <% @ OutputCache Duration = "3600" VaryByParam = "*"%>, в веб-конфигурации используйте провайдер кэша appfabric для вывода кэша и создайте ссылку на подписку на кэш. на лазурном с предоставленным кодом
Используйте только один экземпляр веб-ролика, запустите страницу, она запишет ее, перезагрузит пару раз, она работает нормально
Шаг 2
Теперь увеличьте до 2 или более экземпляров этой WebRole
Вот моя проблема, перезагрузите страницу default.aspx на клиенте, и теперь, в зависимости от веб-ролика, который loadbalancer направит на ваш запрос, вы можете получить ошибку System.Web.Caching.CacheDependency из-за того, что default.aspx кэшируется в распределенном кэше. Похоже, что он основан на зависимости от отслеживания файлов, жестком пути к странице default.aspx, например "E:\sitesroot\2\". Но у вас может быть (и у вас есть) "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)
Я борюсь с этими ошибками с одной недели, я не понимаю, если кто-нибудь знает способ реализации распределенного кэша вывода для нескольких экземпляров веб-ролей, пожалуйста, поделитесь своим решением.
РЕДАКТИРОВАТЬ
Я прекратил полностью отбрасывать провайдер asc.net outputcache для appfabric и писать собственный кеш с appfabric. Прекрасно работает, несколько строк кода и зависимость кэша от Azure стало проще.
1 ответ
Я прекратил полностью отбрасывать провайдер asc.net outputcache для appfabric и писать собственный кеш с appfabric. Прекрасно работает, несколько строк кода и зависимость кэша от Azure стало проще.