博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Windows Azure Cloud Service (22) Web Role的Full IIS特性
阅读量:5946 次
发布时间:2019-06-19

本文共 2686 字,大约阅读时间需要 8 分钟。

《》

 

  在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平台,然后远程桌面连接进入Azure VM的IIS里。可以看到一个叫EmployeeWeb_IN_0_Web的站点

  在Windows Azure SDK 1.3更新中,Windows Azure平台对于Web Role的部署方式进行了改革。虽然用户还可以通过手动修改CSDEF文件的方式强制使用Hosted Web Core模式,但是在默认情况下,Windows Azure平台将会使用操作系统的IIS来部署Web Role。下图展示了在Full IIS模式下,网站、RoleEntry类、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()函数,具体请参考,只能部署到Windows Azure上才能执行Application_Start()。但是笔者升级到Azure SDK 1.6之后,SetConfigurationSettingPublisher写在WebRole的OnStart的方法里也可以成功执行。所以在新的SDK 1.6里不必拘泥于执行代码到底是写在WebRole.cs还是Global.asax里。)

  另外一个问题就是公有变量(属性)读写操作的失败。在 里,当应用程序加载了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 微软云计算平台技术详解》 电子工业出版社

 

  

 

转载地址:http://edbxx.baihongyu.com/

你可能感兴趣的文章
《C++ Primer》 Part III(Classes and Data Abstraction)
查看>>
FriendlyUrls——在ASP.NET Web表单中使用更友好的URL
查看>>
【javascript】字符串对象常用 api
查看>>
对PostgreSQL中 index only scan 的初步理解
查看>>
poj 2337 Catenyms
查看>>
第46周星期二
查看>>
hdu1231-最大连续子序列
查看>>
TMG阵列部署选择
查看>>
Repeater 控件 当数据源没有数据的时候显示 暂无数据 的两种方式
查看>>
大型网站的架构设计图分享-转
查看>>
9.15游戏化体验的原则初探
查看>>
(function(){...}())与(function(){...})()
查看>>
css实现气泡框效果
查看>>
【原创】已知四个坐标点求其两条直线交点坐标
查看>>
request 路径随笔
查看>>
.NET基础之自定义泛型
查看>>
HTML5 Canvas 实现的9个 Loading 效果
查看>>
java.lang.NoClassDefFoundError: org/apache/avro/ipc/Responder
查看>>
利用JasperReport+iReport进行Web报表开发
查看>>
JSON and Microsoft Technologies(翻译)
查看>>