[Windows Azure] 移轉 ASP.NET 應用程式到 Windows Azure 環境的注意要點

[Windows Azure] 移轉 ASP.NET 應用程式到 Windows Azure 環境的注意要點

我想 Windows Azure 推廣到現在,要怎麼把現有的應用程式移轉到 Windows Azure 上也是大家關注的重要議題,尤其是有搭配資料庫的應用程式,要怎麼平順的把應用程式由 On-premises 環境移到 Cloud 環境,這將會是未來幾個月大家會比較重視的事情。

首先,Windows Azure 上面可以運行的具使用者介面的應用程式只有 ASP.NET 應用程式(或者 PHP/Ruby/JSP 等 Web Framework,但本文只針對 ASP.NET 來說明),它會被置於 Web Role 上,因此你的 ASP.NET 應用程式必須要依照 Web Role 的規範與限制來部署,否則將無法在 Windows Azure 上執行。

以下列出 ASP.NET 應用程式各部份在移轉的注意要點:

1. 若你的 ASP.NET 應用程式是 “網站 (Web Site)” 而不是 “應用程式 (Web Application Project)” 的話,會無法在 Web Role 上跑 (無法加到 Cloud 應用程式專案的 Web Role 中),因此你可以利用 Visual Studio 提供的轉換工具來將網站轉成應用程式。

2. ASP.NET 應用程式的 Web.config 無法在 Web Role 中隨意修改,若你的應用程式有需要在線上運轉時調整資料或設定的話,建議把它移到 ServiceConfiguration.cscfg 中,如此可以讓你在 Web 管理工具中更改設定值。並實作 RoleEnvironmentChanging 與 RoleEnvironmentChanged 事件,針對每次修改 ServiceConfiguration.cscfg 時引發的 Role State Change 做處理,以套用新的設定值。

3. 預設情況下,Windows Azure 的 Roles (不論是 Web 或 Worker) 會執行在 .NET Framework 的部份信任模式 (partial trust environment),若你的應用程式沒有特別會存取到系統物件的話,可以不必改變設定,但若你有下列情況,就要修改 ServiceDefinition.csdef 檔案,啟用完全信任 (Full trust environment) 模式才可以正常使用

A. 你的應用程式有使用到 P/Invoke 存取 API DLL 時。
B. 你的應用程式有使用到 WCF,或像 .NET Services (即 AppFabric) SDK 時,它會需要完全信任模式。
C. 你的應用程式有利用具名管道 (Named pipe) 與其他應用程式通訊。
 

4. ASP.NET 狀態管理與快取的兩三事:

A. Session 管理:in-process session 仍可用,但如果 Web Role 有開放兩個以上的 instance 時,in-process session 無法跨越 VM,所以必須要用 SQL Server 來儲存狀態資料,這表示你會需要購買 SQL Azure 資料庫,以及將 ASP.NET 的狀態與各項個人化功能的提供者轉向給 SQL Azure,當然你也可以將它儲存到 Windows Azure 的 Table Storage 去,轉存資料到 Table Storage 的 Provider 已經熱心人士實作,並放在 Codeplex 上
B. ASP.NET 的 Cache API 不支援跨越 VM 的能力

C. 可考慮使用像 memcached 這類的產品。
D. Cookies, hidden 與 Client-side provider 等都可以正常運作。
E. Windows Server AppFabric 中的快取核心-Velocity 在 Windows Azure 上尚未被支援。

5. 若有使用到內建的 Forms Authentication,則需要將對應的資料庫移轉到 SQL Azure 或是 Windows Azure Table Storage 上。若是使用 SQL Azure,則只要改連線字串即可;若是移轉到 Table Storage,則要下載 Codeplex 上的 TableStorageMembershipProvider 和 TableStorageRoleProvider,並加到應用程式中。下載點:http://azuresecurity.codeplex.com/wikipage?title=Web%20Application%20Scenarios&referringTitle=Home
 

6. 在 Windows Azure 上沒有 SMTP Server,因此要透過外部的 SMTP Server (例如 Gmail) 來寄信。

7. 在 Windows Azure 上,若你要使用檔案系統,請務必使用 Windows Azure Drive,而不是使用 VM 本身的空間,因為存在 VM 本身磁碟空間的資料會在 VM 被刪除或重配置時消失,而 Windows Azure Drive 會儲存到 Windows Azure Storage 空間,因此不會消失。

8. 若你有使用到 COM 元件,請想辦法將它改成 .NET 元件或是 Win32 DLL,因為 Windows Azure 上不支援 COM,可替代的方案有將 COM 的功能改寫成 EXE,並且利用 WCF 來在 Web 與 Worker 間溝通。

9. 若你只需要將資料庫移轉到 SQL Azure 而不移轉自己的應用程式,則請將連線字串修改指向 SQL Azure 資料庫,並且將資料庫搬到 SQL Azure 中,可用的工具有 SQL Server 2008 R2 的 SSMS/SSIS 或是 SQL Azure Migration Wizard (on Codeplex)。

10. ADO.NET Data Services 與 ADO.NET Entity Framework 可支援 SQL Azure,但請記得將連線字串中的 DataSource 改成 Server;Initial Catalog 改成 Database;設定 user id 與 password;將 Trust_Connection=true 取代 Integrated Security=true|SSPI 的設定。

11. 若你的 ASP.NET 應用程式是三層或多層式的,並且有 Data Access Layer 的話,請視你的資料儲存來改寫你的 DAL。

12. 若你的 ASP.NET 應用程式需要執行背景工作,或是切割工作處理的話,可利用 Worker Role 來做,並且用 queue 在 Web 和 Worker 間做通訊,當然 WCF 也是可以用的。

13. 善用 SQL Server Management Studio 產生 SQL Scripts,將資料結構移轉到 SQL Azure 資料庫中。

14. SQL Server 資料庫移轉可以用 SSIS, BCP, SqlBulkCopy 類別,或是使用 INSERT 將資料移到 SQL Azure 中。

15. 可以視需要使用 Windows Azure AppFabric 上的存取控制或服務匯流排功能。

本文參考:http://blogs.globallogic.com/aspnet-application-migration-to-windows-azure