10

我刚刚开始学习 Azure 的技术细节,如果这是一个愚蠢的问题,我深表歉意。

如果我在 Visual Studio 中创建一个云服务项目并为 mvc 应用程序添加一个 webrole,则在 mvc 应用程序中我可以看到“WebRole.cs”文件。但是,当我从 MVC 应用程序作为起点开始,然后想要为 Azure 启用它时,通过右键单击项目并选择“添加 Windows Azure 云服务项目”,不会创建 WebRole.cs。

那么在 WebRole 的启动事件中,我该去哪里使事情发生呢?Global.asax 文件的 Application_Start() 事件?

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

我找到了以下帖子,其中提供了部分解释: 什么首先启动 Application_Start 或 WebRole 的 OnStart?

因此,如果 WebRole 的 onStart 事件发生在 Global.asax 中的 Application_Start() 之前,如果我想在稍后启用应用程序的项目中的 onStart() 事件上运行一些代码,会发生什么情况天蓝色?

4

3 回答 3

15

当没有扩展RoleEntryPointweb 角色的类时运行得很好,只是没有运行额外的代码而不是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()

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

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

于 2013-05-22T09:00:06.003 回答
0

我可能在这里误解了这个问题,所以如果是这样,请告诉我。

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

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

于 2013-05-21T22:20:37.227 回答
0

您可以拥有从 RoleEntryPoint 类继承的角色的单个入口点类。通常 workerrole.cs 或 webrole.cs 都是从这里继承而来的。

你可以给任何类名,只要它继承自 RoleEntryPoint。

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

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

于 2013-05-22T08:40:05.487 回答