技术开发 频道

ASP.NET应用向Windows Azure迁移技巧

  【IT168 应用】在我前面的两篇文章中分别介绍了开发Windows Azure 应用的准备工作和简单的ASP.NET on Windows Azure开发。通过对这两篇文章的阅读学习,我们可以从头开发出一些Windows Azure应用程序,但毕竟我们要希望放到云端的应用程序都是新开发的,很可能是已经开发一部分甚至已正式使用的。那么我们该如何将这些现有的应用程序进行适当的修改,以便能够迁移部署到Windows Azure上呢?下面我将带你一起讨论这个议题。

  首先,我们需要知道Windows Azure虚拟机上的程序集是有限的,并非你引用的所有程序集都会默认包含在其中。Windows Azure仅包含了.NET 3.5 SP1和.NET 4的默认程序集以及Windows Azure的特殊程序集,因此当我们用到了不在此范畴的程序集时,需要在引用它们时需要将程序集属性中的Copy Local设置True。

  这样我们最终编译的应用程序中就将这些程序集文件包含在部署包中。但问题出现了,我们怎么知道到底哪些程序集引用应该设置为Copy Local=True呢?嗯,在这个怪异的时代雷锋依然还是存在的,一个帮助我们检查哪些需要Copy Local=True的网站:http://gacviewer.cloudapp.net/

  请注意,该网站目前还不支持F#的项目的检测哦,csproj和vbproj文件均支持。

  OK,程序集的问题我们解决了,那么再了解一下ASP.NET应用要移植到Windows Azure还有哪些明显的限制呢?

  1. Windows Azure不支持网站 (Web Site)的项目,仅支持Web应用程序(Web Application Project)。如果您的ASP.NET网站使用的Web Site而不是Web Application Project,那么请先用Visual Studio 2010中提供的转换工具将网站转换为应用程序吧。

  2. ASP.NET应用程序的web.config文件无法在Web Role中随意修改,请考虑将需要修改的设置项放在ServiceConfiguration.cscfg中,以便可以使用web管理工具更改;或考虑在数据库中存储部分应用的设置。

  3. 如果您的应用程序中涉及使用了P/Invoke、WCF、>nET Services SDK、Named pipe等技术时,需要在ServiceDefinition.csdef中或者对应的WebRole的属性面板上 确保启用完全信任模式。

  4. ASP.NET默认的Cache API实现不支持跨VM,所以考虑使用AppFabric、Memcached之类的产品来解决缓存同步问题。

  5. 如果你的应用程序会被大量用户使用,那么可能会需要将Web Role设置为2个以上的实例数,以便支持负载均衡。那么此时,需要注意ASP.NET 默认的Session实现是In-Process的无法跨越VM,所以需要考虑使用SQL Azure等来作为状态存储策略。

  6. 涉及到SMTP发送邮件时,需要调用外部的SMTP Server来发送邮件,建议根据选择的Azure所在数据中心区域选择相应区域的SMTP Server,以保证相对性能。

  7. 如果网站中涉及到文件系统的操作,请将相应代码使用Windows Azure Storage的相关API实现,否则由于Azure中的VM的特殊机制会出现文件丢失的情况。当然了,最好我们通过一个抽象一个接口的方式来隔离文件系统的操作实现差别,具体的实现大家可以参考“统一Windows Azure和一般web应用之间的文件操作代码”。

  8. COM组件不受支持,所以如果你的网站用到了COM组件,请考虑使用其他解决方案,或者将COM的功能在别处实现为一个WCF Service供该网站应用程序调用。

  9. 如果你的网站原来使用的SQL Server作为数据存储方案,那么请不用担心代码的修改,只需要将相应的数据库连接字符串做一下修改即可。但前提是,你已经使用SQL Server 2008 R2 的 SSMS/SSIS或 SQL Azure Migration Wizard (on Codeplex)或VS2010的数据工具将原始数据库移植到了Sql Azure中。

  那么知晓上述问题并做了适当调整之后,接下来我们该如何将现有的网站项目添加为WebRole呢?您可以按照下面的步骤处理:

  1. 首先,打开Visual Studio 2010,选择创建新项目,项目模板选择Cloud类中Windows Azure Project,

  设置好名字和位置等信息后点击确定按钮,Visual Studio 2010创建一个Windows Azure Project的Solution,并弹出对话框,询问添加什么类型Role的应用,在此我们什么都不添加,直接点击确定按钮,此时我们可以看到一个空的Windows Azure Project项目:

  2. 接下来,我们需要在File菜单中点击Add=>Existing Project,将已经我们准备迁移的Web Application添加到刚次的Solution中。

  3. 此时我们会发现WindowsAzureProject中的Roles文件夹依然为空。OK,在Roles文件夹上点击右键,选择将解决方案中的Web项目添加到Roles中,

  4. 添加好以后我们会看到Roles中对一个跟我们的Web Application一个名字的角色节点。

  此时我们可以在该节点的属性面板上设置信任级别、实例数等各种云中运行时的配置。

  5. 完成上述工作后,需要按照我们本文的第二部分将相应的程序集设置为Copy Local=True

  6. 为了调整网站中的代码适应Windows Azure的环境,我们需要再将以下3个程序集添加到引用中:

  Microsoft.WindowsAzure.Diagnostics

  Microsoft.WindowsAzure.ServiceRuntime

  Microsoft.WindowsAzure.StorageClient

  当然你还可以根据实际的需求添加其他的WindowsAzure程序集,比如CloudDrive

  7. 剩下的工作主要就是根据实际的业务逻辑调整您的代码了。

  8. 整体调整完之后,我们就可以在将Windows Azure Project创建Deploy包并上传至我们的Windows Azure服务器上。不出意外,等一袋烟左右的功夫您的云端Web应用就部署好了。

  怎么样,如果您的ASP.NET应用要移植到云端是不是也挺简单呢?在这个风起云涌的时代能够将自己的应用移植到云端来运行是不是也挺让人欣慰甚至激动的事情呢。别再犹豫了,赶紧拿你的项目副本尝试一下向云端的迁移之旅吧!

1
相关文章