2013-05-21 3 views
8

Я только начинаю мочиться, изучая технические детали Лазури, поэтому извиняюсь, если это глупый вопрос.В чем разница между событием webrole onStart() и Application_Start() global.asax?

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

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

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

Я нашел следующий пост, который предлагает частичное объяснение: What starts first Application_Start or WebRole's OnStart?

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

ответ

13

Когда нет класс расширения RoleEntryPoint веб-роль will run just fine, просто нет дополнительного кода не запускается вместо 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, и его методы будут выполняться как часть времени жизни экземпляра роли.

0

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

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

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

+1

Вот что я понял. Должен ли класс быть назван «WebRole.cs» и существует в корне проекта, или его можно назвать чем угодно и сидеть где угодно, пока он наследует от RoleEntryPoint? Я подозреваю, что он должен будет следовать правилу WebRole.cs обычного webrole для правильной работы. – Steviebob

0

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

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

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

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

+0

Возможно, вы не захотите настроить контейнеры IoC в RoleEntryPoint - это выполняется в [отдельном домене приложения на вашем сайте] (http://azure.microsoft.com/blog/2010/12/02/new-full -iis-capability-difference-from-hosting-web-core /) (см. раздел «Доступ к статическим членам с RoleEntryPoint и вашего веб-сайта»), и поэтому не может с ним разговаривать. –

+0

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

 Смежные вопросы

  • Нет связанных вопросов^_^