2013-05-21 43 views
8

我刚刚开始深入了解Azure的技术细节,所以如果这是一个愚蠢的问题,请道歉。webrole onStart()事件和Application_Start()global.asax事件有什么区别?

如果我在visual studio中创建一个云服务项目并为mvc应用程序添加一个webrole,那么在mvc应用程序中,我可以看到“WebRole.cs”文件。但是,当我以一个MVC应用程序为出发点,然后希望为Azure启用它时,通过右键单击该项目并选择“添加Windows Azure云服务项目”,不会创建WebRole.cs。

那么,我会在WebRole的启动事件上做些什么? Global.asax文件的Application_Start()事件?

如果是这样,Global.asax中的Application_Start()和webrole的onStart()方法有什么区别?

我发现下面的帖子,它提供了部分的解释: What starts first Application_Start or WebRole's OnStart?

所以,如果它是在WebRole的在onStart事件Global.asax中的Application_Start()之前发生的情况下,如果发生了什么我想在一个项目中的onStart()事件上运行一些代码,我之后启用了Azure应用程序?

回答

13

当有扩展RoleEntryPoint Web角色will run just fine不用上课,只是没有额外的代码运行,而不是OnStart()Run()OnStop()

Application_Start()与Azure完全无关,Azure运行时完全忽略它,它只是一些ASP.NET布线。你可以很容易地让Application_Start()无条件抛出一个异常,并且不会阻止你的web角色入门,只是所有的HTTP请求都会失败。

请记住,从SDK 1.3开始,默认模式是“IIS模式”,其中包含RoleEntryPoint子孙的Web角色有效内容在一个进程(WaIISHost.exe)中运行,ASP.NET代码在另一进程中运行。 RoleEntryPoint的进程首先由Azure运行时启动,运行OnStart()并进入Run()的无限循环,然后打开HTTP请求实例。如果您使用IIS 7.5并启用“自动启动”,则可能会先执行Application_Start(),否则在执行第一个请求之前您将不会执行Application_Start()

所以关键是有两个不同的进程运行你的代码,每个进程都有自己的生命周期,并且决定了你如何设计你的应用程序。

RoleEntryPoint后代类可以具有任何名称,属于任何名称空间,并位于项目中的任何.cs文件中,该文件被选为Web角色的负载 - 可能是您的ASP.NET项目。在这些情况下,Azure运行时将定位RoleEntryPoint后代,并且其方法将作为角色实例生存期的一部分运行。

0

我可能误解了这里的问题,所以请让我知道如果是这样的话。

您当然可以从一个普通的ASP.NET项目开始,然后将其转换为在Windows Azure Web角色中运行。 WebRole.cs在技术上并不需要 - 角色应该在没有它的情况下开始。但是,如果你想注入一些逻辑作为角色实例启动过程的一部分,你可以添加一个继承自RoleEntryPoint的WebRole类,并覆盖OnStart()。在那里,你可以做这样的事情配置诊断,创建Windows Azure存储表或队列等

一般来说,我会倾向于把配置/引导逻辑的Web角色的的OnStart() - 更多的平台特定的配置/引导。

+1

这就是我想的。 该类是否必须被称为“WebRole.cs”并且存在于项目的根目录中,还是只要从RoleEntryPoint继承,它就可以被调用并且可以坐在任何地方? 我怀疑它必须遵循普通webrole的WebRole.cs文件的约定才能正常工作。 – Steviebob

0

对于从RoleEntryPoint类继承的角色,可以有单个入口点类。通常workerrole.cs或webrole.cs是从这个继承的。

只要它是从RoleEntryPoint继承的,就可以给出任何类名。

当你的角色正在变得准备好时,这个类的OnStart事件被激发。 在应用程序启动之前,您可以在此处编写初始化逻辑。 它可能是初始化IoC容器,Windows天蓝色诊断配置或任何东西。

当您第一次访问您的网站时,会触发Application_Start事件。您的角色已处于就绪状态。

+0

你可能不想在RoleEntryPoint中配置你的IoC容器 - 这个运行在一个[单独的应用程序域到你的网站](http://azure.microsoft.com/blog/2010/12/02/new-full -iis-capabilities-differences-from-hosted-web-core /)(请参阅“从RoleEntryPoint和您的Web站点访问静态成员”一节),因此无法真正与之交谈。 –

+0

您也没有提及它们运行在不同的进程和应用程序域中。 – NStuke

相关问题