В чем разница между событием webrole onStart() и событием Application_Start() global.asax?

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

Если я создам проект облачного сервиса в Visual Studio и добавлю webrole для приложения mvc, в приложении mvc я увижу файл «WebRole.cs». Однако, когда я начинаю с приложения MVC в качестве отправной точки, а позже хочу включить его для Azure, щелкнув проект правой кнопкой мыши и выбрав «Добавить проект облачной службы Windows Azure», WebRole.cs не создается.

Итак, куда мне обратиться, чтобы все произошло в момент запуска WebRole? Событие Application_Start() файла Global.asax?

Если да, то в чем разница между Application_Start() в Global.asax и методом onStart() веб-ролика?

Я нашел следующий пост, который предлагает частичное объяснение: Что начинается первый Application_Start или OnStart WebRole?

Итак, если событие onStart WebRole происходит до Application_Start() в Global.asax, что произойдет, если я захочу запустить некоторый код в событии onStart() в проекте, где я позже включил приложение для Лазурь?


person Steviebob    schedule 21.05.2013    source источник


Ответы (3)


Когда нет класса, расширяющего RoleEntryPoint, веб-роль будет работать нормально, просто не запускается дополнительный код вместо OnStart(), Run() и OnStop().

Application_Start() совершенно не связан с Azure и полностью игнорируется средой выполнения Azure, это всего лишь часть проводки ASP.NET. Вы можете легко Application_Start() безоговорочно генерировать исключение, и это не помешает запуску вашей веб-роли, просто все HTTP-запросы будут завершаться ошибкой.

Имейте в виду, что, начиная с SDK 1.3, режимом по умолчанию является «режим IIS», в котором полезная нагрузка веб-роли, содержащая RoleEntryPoint потомков, выполняется в одном процессе (WaIISHost.exe), а код ASP.NET выполняется в другом процессе. Процесс с RoleEntryPoint сначала запускается средой выполнения Azure, он запускает OnStart() и входит в бесконечный цикл в Run(), затем экземпляр открывается для HTTP-запросов. Если вы используете IIS 7.5 и у вас включен «автозапуск», вы можете выполнить Application_Start() раньше, но в противном случае вы не будете выполнять Application_Start() до тех пор, пока не придет первый запрос.

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

Класс-потомок RoleEntryPoint может иметь любое имя, принадлежать к любому пространству имен и находиться в любом файле .cs в проекте, который выбран в качестве полезной нагрузки для веб-роли — скорее всего, это будет ваш проект ASP.NET. В этих условиях потомок RoleEntryPoint будет обнаружен средой выполнения Azure, и его методы будут выполняться как часть времени существования экземпляра роли.

person sharptooth    schedule 22.05.2013

Я могу неправильно понять вопрос здесь, поэтому, пожалуйста, дайте мне знать, если это так.

Конечно, вы можете начать с обычного проекта ASP.NET, а затем преобразовать его для запуска в веб-роли Windows Azure. WebRole.cs технически не требуется — роль должна запускаться без него. Но если вы хотите внедрить некоторую логику как часть процесса запуска экземпляра роли, вы можете добавить класс WebRole, наследуемый от RoleEntryPoint, и переопределить метод OnStart(). Там вы можете выполнять такие действия, как настройка диагностики, создание таблиц или очередей хранилища Windows Azure и т. д.

Как правило, я бы предпочел поместить логику конфигурации/загрузки в OnStart() веб-роли - более специфичную для платформы конфигурацию/загрузку.

person mcollier    schedule 21.05.2013
comment
Вот что я понял. Должен ли класс называться WebRole.cs и существовать в корне проекта, или он может называться как угодно и располагаться где угодно, если он наследуется от RoleEntryPoint? Я подозреваю, что для правильной работы ему придется следовать соглашению обычного файла WebRole.cs Webrole. - person Steviebob; 22.05.2013

У вас может быть класс с одной точкой входа для вашей роли, унаследованный от класса RoleEntryPoint. Обычно workerrole.cs или webrole.cs наследуются от него.

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

Событие OnStart этого класса запускается, когда ваша роль становится готовой. Вы можете написать свою логику инициализации здесь перед запуском вашего приложения. Это может быть инициализация контейнеров IoC, диагностическая конфигурация Windows Azure или что-то еще.

Событие Application_Start запускается, когда вы впервые попадаете на свой сайт. Ваша роль уже находится в состоянии готовности.

person bhavesh lad    schedule 22.05.2013
comment
Вы, вероятно, не захотите настраивать свои контейнеры IoC в RoleEntryPoint — это выполняется в отделить домен приложения от вашего сайта (см. раздел Доступ к статическим членам из RoleEntryPoint и вашего веб-сайта), и поэтому на самом деле не может говорить к этому. - person Zhaph - Ben Duguid; 22.07.2015
comment
Вы также не упомянули, что они работают в разных процессах и доменах приложений. - person NStuke; 10.02.2018