Проблема с файловой системой в службе приложений Azure - невозможно создать каталоги - PullRequest
0 голосов
/ 20 сентября 2019

В нашей производственной среде у нас есть основное приложение dotnet, размещенное в службе приложений Azure (на компьютере с Windows).Он состоит из двух компонентов -

  • Служба электронной почты
  • Механизм бизнес-правил

Служба электронной почты сначала загружает все электронные письма в папку Attachments в папкетот же каталог, где размещено приложение (D:\home\wwwroot\).Для каждого электронного письма создается отдельный каталог (со значением guid) в каталоге Attachments.

Механизм бизнес-правил обращается к этой папке и использует электронное письмо и его вложения.После этого мы удаляем все содержимое из каталога Attachments.

Проблема, с которой мы сталкиваемся, заключается в том, что после обработки определенного количества электронных писем наше приложение не может создавать каталоги подпапка Attachments.Оператор

Directory.CreateDirectory({path}) 

выдает ошибку о том, что указанный путь не может быть найден.

Единственный способ решить эту проблему - перезапустить службу приложения и снова выполнить ее успешно.продолжает создавать каталоги, обрабатывать электронные письма до тех пор, пока через день не произойдет сбой 8- |

То, что мы пробовали -

  • Наше приложение было многопоточнымИсходя из того, что, возможно, один поток удерживает блокировку файловой системы из-за неправильной или неполной утилизации ресурсов, мы изменили ее на однопоточную обработку

  • Там, где создавались каталоги, мыиспользовал DirectoryInfo, поэтому пытался использовать DirectoryInfo.Refresh() после каждого удаления, создания и т. д.

  • Где бы ни использовался FileStream, мы добавили явные операторы .Dispose() для удаленияFileStream

  • Вызывается GC.Collect() в конце каждого запуска нашего сервиса

Я подозреваю, что эта проблема связана с Azureсреда, но мы не былив состоянии определить, что вызывает эту проблему.У кого-нибудь были такие проблемы, и если да, то как они были решены?

Ответы [ 2 ]

0 голосов
/ 23 сентября 2019

Я внес некоторые изменения в свой код, основываясь на том, что я прочитал по этим ссылкам, которые дают хорошее представление о системе хранения в службе приложений Azure -

D:\local указывает на папку, которая доступна только для этого экземпляра службы, а не на ту, которую я использовал ранее, которая является общей для экземпляров - D:\home.

Поэтому я изменил код для разрешения переменной среды %Temp%, которая была разрешена до D:\local\Temp, а затем использовал это местоположение для хранения загруженных писем.

До сих пор было выполнено несколько прогонов тестирования.выполняется без каких-либо исключений, связанных с файловой системой.

0 голосов
/ 20 сентября 2019

Да, исходя из вашего описания проблемы, оно выглядит как ограничение песочницы.Чтобы подробнее узнать об этом, стандартные / собственные веб-приложения Azure работают в безопасной среде, называемой песочницей.Каждое приложение запускается в своей собственной изолированной программной среде, изолируя его выполнение от других экземпляров на том же компьютере, а также обеспечивая дополнительную степень безопасности и конфиденциальности, которые в противном случае были бы недоступны.

Служба приложений Azure предоставляет предопределенные стеки приложений в Windows, такие как ASP.NET или Node.js, работающие в IIS.Предварительно настроенная среда Windows блокирует операционную систему от административного доступа, установки программного обеспечения, изменений в глобальном кэше сборок и т. Д. (См. Функциональные возможности операционной системы в службе приложений Azure).Если вашему приложению требуется больше доступа, чем позволяет предварительно сконфигурированная среда, вы можете вместо этого развернуть пользовательский контейнер Windows.

Создание символических ссылок: хотя приложения-песочницы могут следовать / открывать существующие символические ссылки, они не могут нигде создавать символические ссылки (или любые другие точки повторной обработки).

Кроме того, вы можете проверить, есть ли в файлахАтрибут только для чтения, чтобы проверить это, перейдите на консоль Kudu (({yoursite} .scm.azurewebsites.net)) и запустите attrib somefile.txt и проверьте, содержит ли он атрибут R (только для чтения).

...