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

简介:

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平台,然后远程桌面连接进入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()函数,具体请参考这篇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,如需转载请自行联系原作者
相关实践学习
部署Stable Diffusion玩转AI绘画(GPU云服务器)
本实验通过在ECS上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。
目录
相关文章
|
4月前
【Azure 应用服务】Web App Service 中的 应用程序配置(Application Setting) 怎么获取key vault中的值
【Azure 应用服务】Web App Service 中的 应用程序配置(Application Setting) 怎么获取key vault中的值
|
1月前
【Azure App Service】PowerShell脚本批量添加IP地址到Web App允许访问IP列表中
Web App取消公网访问后,只允许特定IP能访问Web App。需要写一下段PowerShell脚本,批量添加IP到Web App的允许访问IP列表里!
|
2月前
|
安全 网络协议 网络安全
Windows Server 2003 Web服务器搭建
Windows Server 2003 Web服务器搭建
|
2月前
|
网络协议 Windows
Windows Server 2019 Web服务器搭建
Windows Server 2019 Web服务器搭建
|
3月前
|
存储 监控
【Azure Cloud Service】在Azure云服务中收集CPU监控指标和IIS进程的DUMP方法
在使用Cloud Service服务时,发现服务的CPU占用很高,在业务请求并不大的情况下,需要直到到底是什么进程占用了大量的CPU资源,已经如何获取IIS进程(w3wp.exe)的DUMP文件?
|
4月前
【Azure Web Job】Azure Web Job执行Powershell脚本报错 The term 'Select-AzContext' is not recognized as the name
【Azure Web Job】Azure Web Job执行Powershell脚本报错 The term 'Select-AzContext' is not recognized as the name
|
4月前
|
iOS开发 Android开发 MacOS
从零到全能开发者:解锁Uno Platform,一键跨越多平台应用开发的神奇之旅,让你的代码飞遍Windows、iOS、Android、macOS及Web,技术小白也能秒变跨平台大神!
【8月更文挑战第31天】从零开始,踏上使用Uno Platform开发跨平台应用的旅程。只需编写一次代码,即可轻松部署到Windows、iOS、macOS、Android及Web(通过WASM)等多个平台。Uno Platform为.NET生态带来前所未有的灵活性和效率,简化跨平台开发。首先确保安装了Visual Studio或VS Code及.NET SDK,然后选择合适的项目模板创建新项目。项目结构类似传统.NET MAUI或WPF项目,包含核心NuGet包。通过简单的按钮示例,你可以快速上手并构建应用。Uno Platform让你的技术探索之旅充满无限可能。
88 0
|
4月前
|
Shell PHP Windows
【Azure App Service】Web Job 报错 UNC paths are not supported. Defaulting to Windows directory.
【Azure App Service】Web Job 报错 UNC paths are not supported. Defaulting to Windows directory.
|
2月前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
137 3
|
1月前
|
设计模式 前端开发 数据库
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
150 45