我刚刚开始学习Azure的技术细节,所以如果这是一个愚蠢的问题,我很抱歉。
如果我在visual studio中创建一个云服务项目,并为mvc应用程序添加一个webrole,在mvc应用程序中我可以看到"webrole .cs"文件。然而,当我开始以MVC应用程序为起点,后来想在Azure上启用它时,通过右键单击项目并选择"添加Windows Azure云服务项目",没有创建WebRole.cs。
那么我该去哪里让WebRole的start事件发生呢?类的Application_Start()事件。asax文件?
如果是,Application_Start()在Global中的区别是什么?asax和webrole的onStart()方法?
我找到了下面的帖子,其中提供了部分解释:什么开始首先Application_Start或WebRole's OnStart?
如果WebRole的onStart事件发生在Global中的Application_Start()之前。asax,如果我想在一个项目的onStart()事件上运行一些代码,我后来在那里启用了Azure的应用程序,会发生什么?
当没有类扩展RoleEntryPoint
时,web角色将运行良好,只是没有额外的代码运行而不是OnStart()
, Run()
和OnStop()
。
Application_Start()
与Azure完全无关,Azure运行时完全忽略它,它只是ASP的一部分。网络布线。你可以很容易地让Application_Start()
无条件抛出一个异常,这不会阻止你的web角色开始,只是所有的HTTP请求都会失败。
请记住,从SDK 1.3开始,默认模式是"IIS模式",其中包含RoleEntryPoint
后代的web角色有效负载在一个进程(WaIISHost.exe)和ASP. exe中运行。. NET代码在另一个进程中运行。具有RoleEntryPoint
的进程首先由Azure运行时启动,它运行OnStart()
并在Run()
中进入无限循环,然后为HTTP请求打开实例。如果您使用IIS 7.5并启用了"autostart",您可能会更早地执行Application_Start()
,否则您将不会执行Application_Start()
,直到第一个请求到来。
所以关键是有两个不同的进程运行你的代码,每个进程都有自己的生命周期,这决定了你如何设计你的应用程序的限制。
RoleEntryPoint
后代类可以有任何名称,属于任何名称空间,并位于项目中的任何.cs文件中,该文件被选为web角色的有效载荷-这可能是您的ASP。网络项目。在这些条件下,RoleEntryPoint
后代将由Azure运行时定位,其方法将作为角色实例生命周期的一部分运行。
我可能误解了这个问题,所以如果是这样,请告诉我。
你当然可以从一个常规的ASP开始。NET项目,然后将其转换为在Windows Azure Web角色中运行。cs在技术上不是必需的-角色应该在没有它的情况下启动。但是,如果你想注入一些逻辑作为角色实例启动过程的一部分,你可以添加一个WebRole类,继承RoleEntryPoint,并覆盖OnStart()。在那里,你可以做一些事情,比如配置诊断,创建Windows Azure存储表或队列等。
一般来说,我倾向于把配置/引导逻辑放在Web角色的OnStart()中——更具体的平台配置/引导。
您可以从RoleEntryPoint类继承角色的单一入口点类。一般来说,workerroles .cs或webroles .cs是继承自this.
你可以给出任何类名,只要它继承自RoleEntryPoint。
当你的角色准备就绪时,这个类的OnStart事件被触发。您可以在应用程序启动之前在这里编写初始化逻辑。它可以是IoC容器的初始化,Windows azure诊断配置或任何东西。Application_Start事件在您第一次访问网站时被触发。您的角色已经处于就绪状态