Облачная служба Azure не работает после перезапуска пула приложений

У меня есть развернутая облачная служба Azure WebRole WebAPI только с одним экземпляром. Я заметил, что если я подожду некоторое время простоя (без HTTP-запросов), то позже служба будет мертва, и каждый запрос к ней приведет к следующему ответу:

{
    Message: "An error has occurred."
}

На панели управления Azure отображается статус экземпляра "Работает". Удаленный рабочий стол показывает, что пул приложений и веб-сайт работают, и что все необходимые службы работают.
Я нигде не могу найти ни одного соответствующего сообщения об ошибке ...

Единственное решение, которое я нашел для вышеуказанной ситуации, - это выполнить перезагрузку виртуальной машины экземпляра.

Поскольку я предположил, что приведенное выше является результатом времени простоя, я посмотрел и обнаружил, что по умолчанию сам пул приложений имеет свойство Idle Timeout, установленное на 20 минут, что приводит к завершению работы рабочего процесса внутри пула приложений после истечения времени ожидания простоя. . Мне удалось воспроизвести проблему, не дожидаясь тайм-аута, вручную запустив повторную переработку пула приложений.

Я предполагаю, что у меня какая-то проблема с моей службой, и я не могу правильно восстановиться после выключения. В качестве доказательства: чистый готовый сервисный проект не привел к такому же поведению.

Что может вызвать такую ​​проблему?
Может ли кто-нибудь указать мне правильное направление отладки этого?
Где я могу найти полезное сообщение об ошибке?

Изменить:
Я использую Autofac для IoC, и мне внезапно пришло в голову, что проблема может заключаться в том, что IoC каким-то образом очищается после повторного использования. Я выполняю регистрацию IoC внутри Application_Start() из Global.asax.cs.
Может быть проблема?


person Liel    schedule 15.06.2013    source источник


Ответы (2)


Когда AppDomain повторно используется IIS, сборки загружаются только по запросу. Вместо этого попробуйте использовать метод GetReferencedAssemblies на System.Web.Compilation.BuildManager, чтобы получить список сборок, на которые есть ссылки.

var assemblies = BuildManager.GetReferencedAssemblies().Cast<Assembly>();

Это должно заставить указанные сборки быть загружены в AppDomain немедленно, что сделает их доступными для сканирования модулей.

person Alex Meyer-Gleaves    schedule 16.06.2013

Я наконец нашел источник проблемы, и он действительно связан с контейнером IoC.

Чтобы воспроизвести проблему локально, я развернул облачную службу на локальном сервере IIS (вместо IIS Express). Теперь я могу остановить / запустить веб-сайт и фактически увидеть трассировку стека исключений, которая сразу же доказала, что проблема действительно связана с незарегистрированными сборками в IoC.

По-видимому, всякий раз, когда пул приложений перезагружается, все загруженные сборки очищаются и не перезагружаются в соответствии с теми же правилами. Я действительно нашел сборку (это проект со слабыми ссылками в моем решении), которая не была загружена в момент повторной инициализации IoC.

Я не уверен, почему он ведет себя не так, как при локальном развертывании, но мне удалось решить свою проблему, позвонив:

Assembly.Load([Assembly Name]);

перед инициализацией IoC.

person Liel    schedule 15.06.2013