Azure Cloud Service е мъртва след Recycle Application Pool

Имам внедрен WebAPI на Azure Cloud Service WebRole само с един екземпляр. Забелязах, че ако изчакам известно време на празен ход (няма HTTP заявки), тогава по-късно услугата е мъртва и всяка заявка към нея води до следния отговор:

{
    Message: "An error has occurred."
}

Таблото за управление на Azure казва, че състоянието на екземпляра е Running. Отдалеченият работен плот разкрива, че наборът от приложения и уеб сайтът работят и че всички необходими услуги работят.
Никъде не мога да намеря подходящо съобщение за грешка...

Единственото решение, което намерих за горната ситуация, е да извърша рестартиране на Instance VM.

Тъй като предположих, че горното е резултат от време на неактивност, погледнах и открих, че по подразбиране самият набор от приложения има свойство за изчакване на неактивност, зададено на 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