webrole onStart()事件和Application_Start() global.asax事件有什么区别?

10
我刚开始学习Azure的技术细节,如果这是一个愚蠢的问题,请原谅。
在Visual Studio中创建云服务项目并添加MVC应用程序的WebRole后,我可以看到"MVC应用程序"文件夹中的"WebRole.cs"文件。但是,如果我以MVC应用程序为起点,并希望稍后将其启用为Azure,则右键单击该项目并选择"添加Windows Azure Cloud Service项目"时,不会创建WebRole.cs文件。
那么,在WebRole的start事件上发生的事情会在哪里执行?是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()事件之前发生,如果我想在稍后启用Azure的项目中在onStart()事件上运行一些代码,会发生什么?
3个回答

15

当没有扩展RoleEntryPoint类时,Web角色将正常运行,只是除了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并启用了“autostart”,则可能会更早地执行Application_Start(),但否则,直到第一个请求到来之前,您将不会执行Application_Start()

因此,关键在于有两个不同的进程运行您的代码,并且每个进程都具有自己的生命周期,这决定了您如何设计应用程序的限制。

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


0

如果我误解了问题,请告诉我。

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

通常,我倾向于将配置/引导逻辑放在Web角色的OnStart()中 - 更多的是平台特定的配置/引导。


1
这正是我想到的。 这个类必须被称为“WebRole.cs”,并存在于项目的根目录中吗?或者只要它从RoleEntryPoint继承,它可以被称为任何名称并坐在任何地方? 我怀疑它必须遵循普通webrole的WebRole.cs文件的约定才能正确运行。 - Steviebob

0

您可以创建一个单一入口类,该类继承自RoleEntryPoint类。通常情况下,workerrole.cs或webrole.cs都是从这个类继承而来。

您可以给任何类命名,只要它是从RoleEntryPoint继承而来即可。

当您的角色准备就绪时,将触发此类的OnStart事件。在应用程序启动之前,您可以在此处编写初始化逻辑。它可以是IoC容器的初始化、Windows Azure诊断配置或其他任何内容。

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


你可能不希望在 RoleEntryPoint 中配置你的 IoC 容器 - 这在与你的网站分开的应用程序域中运行(请参阅“从 RoleEntryPoint 和你的网站访问静态成员”一节),因此无法真正与其通信。 - Zhaph - Ben Duguid
您还没有提到它们在不同的进程和应用程序域中运行。 - NStuke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接