我刚刚开始学习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()方法之间的区别是什么?
我发现了以下帖子,其中提供了部分解释: What starts first Application_Start or WebRole's OnStart?
因此,如果WebRole的onStart事件发生在Global.asax中的Application_Start()之前,如果我想在我稍后启用的项目中的onStart()事件上运行一些代码,会发生什么情况Azure的应用程序?
答案 0 :(得分:14)
如果没有课程延长RoleEntryPoint
网络角色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
后代,其方法将作为角色实例生存期的一部分运行。
答案 1 :(得分:0)
我可能在这里误解了这个问题,如果是的话请告诉我。
您当然可以从常规ASP.NET项目开始,然后将其转换为在Windows Azure Web角色中运行。 WebRole.cs在技术上并不需要 - 角色应该在没有它的情况下开始。但是,如果要在角色实例的启动过程中注入一些逻辑,则可以添加继承自RoleEntryPoint的WebRole类,并覆盖OnStart()。在那里,您可以执行诸如配置诊断,创建Windows Azure存储表或队列等操作。
通常,我倾向于将配置/引导逻辑放在Web角色的OnStart()中 - 更具体的平台配置/引导程序。
答案 2 :(得分:0)
您可以将单个入口点类添加到从RoleEntryPoint类继承的角色。通常,workerrole.cs或webrole.cs都是从此继承的。
如果从RoleEntryPoint继承,则可以提供任何类名。
当您的角色变为准备就绪时,此类的OnStart事件将被触发。 您可以在应用程序启动之前在此处编写初始化逻辑。 它可能是IoC容器的初始化,Windows Azure诊断配置或任何其他内容。
第一次访问您的网站时会触发Application_Start事件。你的角色已经处于准备状态。