22
GWAB Lab-雲端專案 本手作實驗 (Hands-on Lab) GWAB 2013 Taiwan 的手作實驗之一, 本手作實驗將會建 立兩個雲端專案,一個是 Web Role,用於展示將 Web 應用程式掛上 Windows Azure 流程;另一個是 Worker Role,用以展示將 ASP.NET Web API Self-hosting 服務掛載到 Windows Azure 以供應雲端上的服務,最後會使用 SQL Database 在兩個不同的執行個體 之間維護 Session 工作狀態。 本實作的學習目標 當實作完成時,學員應該會: 使用 Visual Studio 2012 建立雲端專案。 部署 ASP.NET MVC 4.0 Web 應用程式到雲端。 部署 ASP.NET Web API 服務到雲端。 在不同執行個體之間共享 Session 工作階段資料。 本實作的前置需求 1. Visual Studio 2012 或是 Visual Studio 2012 Express for Web2. Windows Azure SDK for .NET Visual Studio Tools for Windows Azure v1.8 3. SQL Server 2012 SQL Server Express 2012 SQL Server Express 2012 LocalDB 4. 有效的 Windows Azure 訂閱或申請 90 天試用訂閱。 本實作的估計時間

Lab01 cloud project

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: Lab01 cloud project

GWAB Lab-雲端專案

本手作實驗 (Hands-on Lab) 為 GWAB 2013 Taiwan的手作實驗之一, 本手作實驗將會建立兩個雲端專案,一個是Web Role,用於展示將Web應用程式掛上Windows Azure的流程;另一個是Worker Role,用以展示將 ASP.NET Web API Self-hosting服務掛載到Windows Azure以供應雲端上的服務,最後會使用 SQL Database在兩個不同的執行個體之間維護 Session工作狀態。

本實作的學習目標

當實作完成時,學員應該會:

使用 Visual Studio 2012 建立雲端專案。

部署 ASP.NET MVC 4.0 Web應用程式到雲端。

部署 ASP.NET Web API 服務到雲端。

在不同執行個體之間共享 Session工作階段資料。

本實作的前置需求

1. Visual Studio 2012 或是 Visual Studio 2012 Express for Web。

2. Windows Azure SDK for .NET與 Visual Studio Tools for Windows Azure v1.8

3. SQL Server 2012 或 SQL Server Express 2012 或 SQL Server Express 2012 LocalDB

4. 有效的Windows Azure訂閱或申請 90 天試用訂閱。

本實作的估計時間

Page 2: Lab01 cloud project

大約 45-60 分鐘

實作的步驟

練習 1:建立與部署雲端專案

練習 2:建立與部署雲端上的Web API服務

練習 3:在執行個體之間共用 Session工作狀態資料

練習 1. 建立與部署雲端專案

1. 請開啟 Visual Studio 2012,並選擇【檔案 -> 新增 -> 專案】,這時應會看到新增專案的對話盒,請選擇 Visual C# -> Cloud -> Windows Azure雲端服務。

2. 將專案名稱命名為 FirstCloudService,並按確定,此時會出現新增Windows Azure雲端服務的對話盒,請選擇 ASP.NET MVC 4 Web角色,並按中間的 “>” 將專案加到方案內,然後按確定。

Page 3: Lab01 cloud project

3. 在MVC 專案類型對話盒出現時,請選擇網際網路應用程式專案,然後按確定。Visual Studio會將雲端專案與MVC 應用程式專案產生出來。

4. 在 Visual Studio完成專案建置後,請按 F5 來執行專案,當應用程式啟動完成時,您會看到下列畫面。

Page 4: Lab01 cloud project

5. 請將除錯器停止後,在 Visual Studio 2012 的雲端專案上按下右鍵,並選擇發行。

6. 此時發行Windows Azure應用程式精靈會出現,請選擇『登入以下載憑證』,進入Windows Azure管理介面1,這時會自動下載一份發行設定檔。

1 會需要登入。

Page 5: Lab01 cloud project
Page 6: Lab01 cloud project

7. 請回到Windows Azure發行精靈,按下匯入按鈕,並選擇前一步下載的發行檔案,並按開啟,即可在訂用帳戶中看到自己的訂閱。

8. 確認要使用的訂閱後,按下一步,然後在雲端服務的下拉選單中選擇建立新項目。

Page 7: Lab01 cloud project

9. 在建立Windows Azure服務對話盒出現時,於名稱給定一個獨一無二的名稱,位置請選擇 East Asia (東亞),然後按確定。

若名稱重覆時會出現錯誤訊息:

NOTE: 您也可以先在Windows Azure管理介面中建立新的雲端服務後,再開啟Windows Azure發行精靈,選擇已建立的雲端服務。

10. 請選擇進階設定頁籤,並在儲存體帳戶的下拉選單中選擇建立新項目,並給予一個獨一無二的名稱,位置一樣選擇 East Asia,然後按確定。完成這個步驟之後,按下一步。

Page 8: Lab01 cloud project

NOTE: 在這裡所建立的儲存帳戶是 Visual Studio為了要暫存發行檔案所需要的。

11. 於發行摘要頁面中,確認發行的組態後,按下發行按鈕。

Page 9: Lab01 cloud project

12. Visual Studio會開始發行雲端服務專案,並且開啟Windows Azure活動記錄檔視窗,您可以在這裡看到部署的進度。

13. 當 Visual Studio發行完成後,網站 URL 即可使用,請直接按下該連結,會自動開啟瀏覽器,您應該會看到網站已正常的執行在Windows Azure環境。

Page 10: Lab01 cloud project

NOTE: 雲端服務的 URL 是[cloudservicename].cloudapp.net,您可以使用 DNS CNAME來設定成您想要的 DNS 名稱。

Page 11: Lab01 cloud project

練習 2. 建立與部署雲端上的Web API 服務

1. 在前一個練習中所建立的雲端專案上的角色資料夾按右鍵,選擇加入 > 新增背景工作角色專案,然後在加入新的.NET Framework 4.5 角色專案中,選擇背景工作角色,將專案命名為WebApiService,然後按確定。

2. 在 Visual Studio完成加入Worker Role 到專案的工作後,請到WebApiService專案上,於參考資料夾上按右鍵,選擇管理 NuGet 套件:

Page 12: Lab01 cloud project

3. 當管理 NuGet 套件對話盒出現時,請確認左側是選擇線上,然後在搜尋的對話中輸入Web API Self Host,NuGet 會搜尋目前可用的套件,請確認有找到Microsoft ASP.NET Web API Self Host,然後按安裝。當授權合約出現時,請選擇我接受,即可繼續進行安裝。當完成安裝後,請關閉此對話盒。

Page 13: Lab01 cloud project

4. 請於參考資料夾上按右鍵,選擇加入參考,並在參考管理員中,於組件>架構選擇System.Net.Http組件後,按確定。

5. 請在WebApiService內加入一個新的類別,名稱為 ValuesController,然後在ValuesController.cs中加入下列程式碼,完成後將它儲存:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Web.Http; using System.Web.Http.Controllers; namespace WebApiService

Page 14: Lab01 cloud project

{ public class ValuesController : ApiController { public IEnumerable<string> Get() { return new string[] { "Value1", "Value2" }; } } }

6. 打開WorkerRole.cs檔案,在命名空間宣告中加入下列宣告:

using System.Web.Http; using System.Web.Http.SelfHost;

7. 於WorkerRole.cs檔案中,宣告下列類別層次的變數:

public class WorkerRole : RoleEntryPoint { private HttpSelfHostServer _httpServer = null; private HttpSelfHostConfiguration _httpConfiguration = null;

... }

8. 請於WorkerRole.cs檔案中的 OnStart 方法中,加入下列紅字部份的程式碼:

public override bool OnStart() { ServicePointManager.DefaultConnectionLimit = 12; this._httpConfiguration = new HttpSelfHostConfiguration("http://[cloudservicename].cloudapp.net:8080"); this._httpConfiguration.Routes.MapHttpRoute( name: "ValueApi", routeTemplate: "api/{controller}", defaults: new { controller = new ValuesController() }); this._httpServer = new HttpSelfHostServer(this._httpConfiguration); return base.OnStart(); }

Page 15: Lab01 cloud project

NOTE: [cloudservicename]即是您於前面所建置的雲端服務名稱。

9. 請到 OnRun方法中,加入下列紅字部份的程式碼:

public override void Run() { this._httpServer.OpenAsync().Wait(); while (true) { Thread.Sleep(10000); } }

10. 請在WorkerRole 類別中,加入一個新的 OnStop覆寫方法:

public override void OnStop() { this._httpServer.CloseAsync().Wait(); base.OnStop(); }

11. 請在雲端專案內的角色資料夾中,找到WebApiService並於其上按右鍵,以打開雲端專案屬性:

Page 16: Lab01 cloud project

12. 於專案屬性視窗中,於左邊選擇端點,並加入一個新的端點,類型為 Input,通訊協定為 Http,公用連接埠為 8080,私人連接埠也是 8080。

NOTE: 公用連接埠因為前一個練習所建立的Web Role 佔用了 Port 80,因此這裡不能使用 Port 80,所以改用 8080。私人連接埠則要和服務所用的連接埠對應,由於程式中使用的是8080,因此私人連接埠也要使用 8080,否則會連接不上。

13. 請打開雲端專案中的 ServiceDefinition.csdef 檔案,找到WorkerRole 的設定,並加入要求執行期必須得到核准權限的設定,否則會在初始化時發生死亡迴圈 (dead loop) 問題,因為 Self-hosting無法取得正確的權限以附掛通訊埠。

<?xml version="1.0" encoding="utf-8"?> <ServiceDefinition name="FirstCloudService" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition" schemaVersion="2012-10.1.8"> <WebRole name="MvcWebRole1" vmsize="ExtraSmall"> ... </WebRole> <WorkerRole name="WebApiService" vmsize="ExtraSmall"> <Runtime executionContext="elevated" /> ... </WorkerRole> </ServiceDefinition>

Page 17: Lab01 cloud project

14. 請依練習一的作法進行專案的發行,當發行完成後,請使用瀏覽器瀏覽http://[cloudservicename].cloudapp.net/api/values,應該可以看到下圖的畫面,表示服務己經成功運作。

NOTE: [cloudservicename]即是您於前面所建置的雲端服務名稱。

練習 3. 在執行個體之間共用 Session 工作狀態資料

本練習將會使用 SQL Database結合 ASP.NET 4.0 新增的 Universal Providers將SessionStateProvider與 SQL Database 相連,以達到在不同虛擬機器間共享工作狀態資料的功能。首先,我們必須要先準備好 SQL Database,請到Windows Azure管理介面內,新增一個 SQL Database命名為 SessionStateLab,以作為實驗所需的資料庫。請在Windows Azure管理介面的新增功能表中指向【資料服務->SQL Database->快速建立】來同時建立資料庫與伺服器,如下圖所示。

Page 18: Lab01 cloud project

1. 請進入練習一所建立的MVC Web應用程式,在參考資料夾上按右鍵,選擇管理NuGet 套件,並在管理 NuGet 套件對話盒中,於搜尋文字方塊中輸入 ASP.NET Universal Provider,NuGet 會列出符合條件的套件,請安裝Microsoft ASP.NET Universal Providers Core。

Page 19: Lab01 cloud project

NOTE: 本練習所用到的Microsoft ASP.NET Universal Provider Core是 ASP.NET 4.0 發表的Universal Provider的更新版,內含 Entity Framework 5.0,因此具備 Code First 的資料存取能力,不需要先準備資料庫結構 (schema) 即可享有於資料庫間共用 Session資料的能力。

2. 請打開Web.config,加入 Session State的設定如下:

<sessionState mode="Custom" customProvider="DefaultSessionProvider"> <providers> <add name="DefaultSessionProvider" type="System.Web.Providers.DefaultSessionStateProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" /> </providers> </sessionState>

NOTE: 上述的指令可到這個網站取得:http://tinyurl.com/blguwgh

3. 修改Web.config,將預設的資料庫連線 (DefaultConnection) 的字串設定為連接到SQL Database的連線字串:

<connectionStrings>

<add name="DefaultConnection" connectionString="Data Source=[servername].database.windows.net;Initial Catalog=SessionStateLab;User ID=[username]@[servername];Password=[password];Encrypt=true;Trusted_Connection=false;MultipleActiveResultSets=True" providerName="System.Data.SqlClient" />

</connectionStrings>

Page 20: Lab01 cloud project

NOTE: [servername] 為 SQL Database 的伺服器名稱,[username] 為 SQL Database的帳戶名稱,[password] 為 SQL Database帳戶密碼。

4. 請打開 Controllers\HomeController.cs,加入 Windows Azure Service Runtime的命名空間參考:

using Microsoft.WindowsAzure.ServiceRuntime;

5. 於 HomeController.cs中,修改原有的 Index 方法,加入下列程式:

public ActionResult Index() { ViewBag.Message = "Modify this template to jump-start your ASP.NET MVC application."; if (Session["myData"] == null) Session["myData"] = (new Random()).Next(100000, 999999); TempData["view"] = Session["myData"]; TempData["role"] = RoleEnvironment.CurrentRoleInstance.Id; return View(); }

6. 於 Views\Home 中找到 Index.cshtml,打開它,並加入下列指令:

@section featured { <section class="featured"> ... </section> } <h3>Session Information:</h3> <ul> <li>myData: @TempData["view"].ToString()</li> <li>RoleName: @TempData["role"].ToString()</li> </ul> <h3>We suggest the following:</h3>

Page 21: Lab01 cloud project

<ol class="round"> <li class="one"> ...

7. 請在雲端專案的角色資料夾中在Web Role 專案上按右鍵,並在組態設定中將執行個體計數設定在 2 (大於 2 也可以,最少要兩個)。

8. 完成後請建置此專案,並參考練習一來發行這個專案,當發行完成後,請用瀏覽器打開專案的 URL,請記下第一次產生的myData 編號,然後重覆重新整理,您會發現RoleName 會變化,但 Session的myData不會變化,表示 Session已經成功在兩個 (或以上) 的執行個體中共享。

Page 22: Lab01 cloud project

相關的Windows Azure Training Kit 參考實作

簡報檔:

PRESENTATION-WindowsAzureOverview PRESENTATION-WindowsAzureCloudServices PRESENTATION-CloudServiceLifecycle

手作實驗:

HOL-IntroToCloudServices HOL-AdvancedWebWorkerRoles HOL-MigratingAspNetApps-VS2012 HOL-DebuggingCloudServices-VS2012 HOL-DeployingCloudServices-VS2012