我们浏览Windows Azure项目。如下图所示
可以看到Windows Azure的项目包含传统的ASP.NET工程文件,如Default.aspx和Global.asax等。但是又多了一些东西:名为WeRole.cs的文件。其中定义了一个名为WebRole的类,它派生自RoleEntryPoint这个在Windows Azure SDK中定义的基类。
RoleEntryPoint这个类定义在Microsoft.WindowsAzure.ServiceRuntime命名空间中,位于Assebly Microsoft.WindowsAzure.ServiceRuntime.dll这个文件里面。它随着Windows Azure SDK安装到开发计算机中。
Microsoft.WindowsAzure.ServiceRuntime这个命名空间主要提供了对Windows Azure平台运行时的支持,开发人员可以通过它提供的一系列类来获取或设置Windows Azure平台以及运行在其上的Role, Instance等相关属性。其中RoleEntryPoint这个类主要负责Role的生命周期管理。
当一个Role被部署到Windows Azure平台的时候,Windows Azure底层的Fabric Controller会首先基于CSDEF文件分配指定类型的虚拟机,然后讲部署包解压缩到指定的目录。如果是Web Role的话,Fabric Controller将会配置IIS中的网站;如果是Worker Role的话,Fabric Controller会启动特殊的寄宿进程来运行Worker Role代码。最后,Fabric Controller搜索Role里面派生自RoleEntryPoint的类,通过调用下面几个方法对Role进行启动和停止操作。
- OnStart方法: Role启动的时候被调用。 OnStart方法中加入的代码可以处理一些在Role启动时的初始化工作。当返回True的时候表示启动成功,否则表示启动失败。如果在调用过程中出现未捕获的异常则会引发Role的重新启动。
- Run方法:包含Role所执行的业务逻辑操作。Run方法在实现的时候必须是一个无限循环的逻辑,以保证部署之后Role始终处于运行状态。和OnStart一样,任何在Run方法中出现的未捕获异常都会引发Role的重新启动。
- OnStop方法:包含Role停止时的逻辑。OnStop中的代码可供处理一些在Role停止的时候需要执行的收尾或回收工作,例如关闭数据库连接、关闭文件等。需要注意的是,Fabric Controller会判断Role关闭的时候是否超市(30秒)。因此在OnStop里面加入的业务逻辑需要在这个超时范围之内完成,否则将会被视作异常。同样的,任何在OnStop方法中抛出的异常也会引发Role的重新启动。
在Visual Studio中打开WebRole.cs文件便可以看到Windows Azure模板创建的默认内容。可以在OnStart、Run和OnStop方法中加入一些调试信息来检验上述方法何时被调用,以及对应的状态值。
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.WindowsAzure;
using Microsoft.WindowsAzure.Diagnostics;
using Microsoft.WindowsAzure.ServiceRuntime;
using System.Diagnostics;
namespace WebRole1
{
public class WebRole : RoleEntryPoint
{
public override bool OnStart()
{
// For information on handling configuration changes
// see the MSDN topic at http://go.microsoft.com/fwlink/?LinkId=166357.
Trace.WriteLine("Role Instance Start!");
return base.OnStart();
}
public override void Run()
{
Trace.WriteLine("Role Instance is Running!");
base.Run();
}
public override void OnStop()
{
Trace.WriteLine("Role Instance is Stop!");
base.OnStop();
}
}
}
在本地模拟器中运行此代码,可以看到部署好项目之后Windows Azure模拟器自动打开浏览器展示这个网站。我们可以选择Show Compute Emulator UI来查看运行结果。
对于Worker Role而言,Windows Azure项目也会自动生成一个名为WorkerRole.cs的文件,它定义了一个名为WorkerRole的类,同样派生自RoleEntryPoint。而WorkerRole的内容和WebRole稍有不同,但是原理、调用次序和生命周期模型都是一样的。
这里需要提示的是,对于一个Worker Role而言这个WorkerRole类是必不可少的。Fabric Controller需要这个类来确定如何调用并运行当前的Worker Role。但是对于Web Role而言,WebRole这个类是可选的。也就是说Windows Azure Web Role是可以在没有派生自RoleEntryPoint的WebRole类的情况下在Windows Azure平台运行。在这种情况下,Fabric Controller会直接启动ASP.NET的管道模型,从Global.asax文件的Application_Start方法启动网站。但是如果应用程序需要Web Role在启动网站之间完成一些操作,则必须创建这个WebRole类。
一般情况下,我们可以在WebRole.cs的OnStart()函数中,执行初始化的逻辑。
在WebRole.cs的Run()函数中,执行需要持久化运行的逻辑,比如后台运行的Windows Service等等。