且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

Windows Azure Cloud Service (22) Web Role的Full IIS特性

更新时间:2022-09-18 21:58:32

Windows Azure Platform 系列文章目录

 

  在Windows Azure SDK 1.3,用户无法在一个Windows Azure项目中加入多个Web站点(Web Role),也就是说一个Web Role Instance只能部署一个网站,这对于具有在单一网站上使用多个应用程序的Web Application来说是个不小的问题。

  Web Role无法假设多网站的根本原因,是初期的Web Role中真正挂载Web应用程序的执行元件是Hosted Web Core (HWC)引擎,它是一个可以寄宿Web站点的组件,它借用IIS的一部分来处理,执行Web Role的引擎是WaWebHost.exe。但也正是由于Hosted Web Core只是IIS的一个功能子集,因此无法完全实现IIS,包括站点部署、虚拟目录、虚拟应用程序以及WAS(Windows Activation Service)。

但是随着Windows Azure SDK 1.3及其相关功能的更新,现在开发人员已经可以使用名为Full IIS的功能在同一个Role Instance中部署多个Web Role,在这里我介绍一下如何使用Full IIS。

  基于Full IIS部署的Web Role

  我们先新建一个Windows Azure项目,并且添加一个ASP.NET Web Role。打开ServiceDefinition.csdef文件。

Windows Azure Cloud Service (22) Web Role的Full IIS特性

  将这个项目发布到Windows Azure平台,然后远程桌面连接进入Azure VM的IIS里。可以看到一个叫EmployeeWeb_IN_0_Web的站点

Windows Azure Cloud Service (22) Web Role的Full IIS特性

  在Windows Azure SDK 1.3更新中,Windows Azure平台对于Web Role的部署方式进行了改革。虽然用户还可以通过手动修改CSDEF文件的方式强制使用Hosted Web Core模式,但是在默认情况下,Windows Azure平台将会使用操作系统的IIS来部署Web Role。下图展示了在Full IIS模式下,网站、RoleEntry类、IIS等的关系。

Windows Azure Cloud Service (22) Web Role的Full IIS特性

  在Full IIS模式下,Web Role分别在两个进程中运行。首先,RoleEntry中的代码,例如OnStart、Run和OnEnd的代码都会在WaIISHost进程中执行。然后,网站会被部署到IIS中并由w3wp.exe 执行。所以说,在Full IIS模式下,RoleEntry和网站是在不同的应用程序域中运行的。

  由于使用Full IIS模式下网站完全运行于IIS,所以可以使用IIS的全部功能,包括多站点、虚拟目录、虚拟应用程序以及AWS等。但是由于RoleEntry和网站运行于不同的应用程序域,所以在使用Full IIS模式的时候需要特别注意。

 

  使用Full IIS时的注意事项

  Full IIS模式提供完整的IIS功能,但是由于RoleEntry和网站代码运行在不同的应用程序域中,因此在开发的时候需要特别留意如下一些问题。

  首先是配置文件的读取操作。我们知道,要想通过SDK使用Windows Azure存储服务,首先需要设定Storage Account的获取方法,也就是运行下面的代码。

 CloudStorageAccount.SetConfigurationSettingPublisher((configName, configSetter) =>
{
configSetter.Invoke(RoleEnvironment.GetConfigurationSettingValue(configName));
});

  如果将此段代码放在WebRole的OnStart方法中,在网站代码中使用存储服务就会引发异常,异常信息显示必须要事先调用CloudStorageAccount的SetConfigurationSettingPublisher方法。

  为什么在WebRole的OnStart方法中调用无效呢?这是由于在Full IIS模式下,写在Web Role中的代码运行在WaIISHost这个进程之下,而网站代码运行在IIS的w3wp进行,所以上述代码虽然执行了,但是对于网站而言是无效的。因此,如果项目使用的是SDK 1.3及其以后的版本,那么SetConfigurationSettingPublisher要写在ASP.NET的Application_Start方法中,而不能只写在WebRole的OnStart方法中。

(笔者:这个问题在使用Windows Azure SDK 1.3的时候确实会发生这样的问题,而且在本地debug的时候本地模拟器无法执行Global.asax的Application_Start()函数,具体请参考这篇Blog,只能部署到Windows Azure上才能执行Application_Start()。但是笔者升级到Azure SDK 1.6之后,SetConfigurationSettingPublisher写在WebRole的OnStart的方法里也可以成功执行。所以在新的SDK 1.6里不必拘泥于执行代码到底是写在WebRole.cs还是Global.asax里。)

  另外一个问题就是公有变量(属性)读写操作的失败。在Windows Azure Platform (十六)Windows Azure Drive 里,当应用程序加载了BLOB Service中的VHD之后,程序将分配的Cloud Drive盘符寸猝倒了Table Service中,之后再网站代码中又通过Table Service来读取盘符进行操作,而不是直接通过WebRole的某个公有变量传递盘符。这是因为Cloud Drive的代码在WebRole的OnStart()中执行,获取的盘符无法通过WebRole中的变量传递给位于另一个进程中的网站代码,所以必须要通过Table Service进行传递。当然也可以在网站的Application_Start方法中加载Cloud Drive来避免这个问题。

  虽然Full IIS功能改变了整个Web Role的启动和加载模式,和Windows Azure SDK 1.3以前的方式有很大不同,但是由于它能够支持所有IIS特性,所以对于Windows Azure上的Web开发来说还是非常有意义的。

 

本文参考:

徐子岩著的《实战Windows Azure 微软云计算平台技术详解》 电子工业出版社

 

  

 


本文转自Lei Zhang的博客博客园博客,原文链接:http://www.cnblogs.com/threestone/archive/2012/03/10/2388914.html,如需转载请自行联系原作者