本文章是由機器翻譯。

Windows Azure 內行人

Windows 8 和 Windows Azure:雲端中的聚合

Bruno Terkaly
Ricardo Villalobos

下載代碼示例

Bruno Terkaly, Ricardo Villalobos
沒有今天的軟體發展人員必須擁抱雲計算技術,以創建引人注目的 Windows 存儲應用程式的小問題 — — 使用者和設備的數量作出,不用。超過三分之一的地球人口已連接到互聯網,和現在有更多的設備訪問線上資源,有的人更多。此外,移動資料流量增長 2.3-fold 在 2011 年,連續第四年兩倍還多。不管怎麼看,您可以為一個非常簡單的結論:現代應用程式需要連接到雲。

雲計算令人信服的價值主張。大多數觀察家點對需求的可擴充性和向您支付只供您使用作為雲通過驅動因素的事實。然而,雲實際上提供了世界多個連接的設備的一些關鍵的技術。Windows 存儲應用程式的使用者,可能在使用許多應用程式和多個設備,預計其資料的中央位置。如果他們在 Windows Phone 設備上存儲的資料,它還應立即可用其片或任何他們其它的設備,包括 iOS 和 Android 設備上。

Windows Azure 是微軟公共雲計算平臺,提供最大的全球影響力和最全面的服務後端。它支援多個作業系統、 語言、 資料庫和工具選項,提供自動作業系統和服務修補的使用。基本網路基礎結構提供了自動負載平衡和硬體故障彈性。最後但並非最不重要的是,Windows Azure 支援部署模型,它使開發人員能夠升級應用程式,而無需停機。

本文仲介紹的 Web 服務應用程式可以駐留在一個或多個微軟的全球雲計算資料中心在幾分鐘之內。無論您創建待辦事項清單應用程式、 遊戲或甚至業務線會計應用程式,有可能利用這一條,支援依賴或者永久或偶爾連接的用戶端方案中的技術。

您將學習

首先,我們將介紹如何對 Windows Azure 支援非同步用戶端,而不考慮其運行的設備的類型生成一個簡單的雲託管服務 — — 電話、 石板、 平板電腦、 筆記本電腦或桌上型電腦。然後我們將向您展示從 Windows 存儲應用程式檢索資料調用 Web 服務是多麼容易。

一般來說,有資料可以使其方式到 Windows 存儲應用程式中的兩種方法。這篇文章將側重"拉的辦法"來檢索的資料,應用程式需要運行,並通過 HTTP Web 調用發送資料的請求。拉方法通常利用開放標準 (HTTP、 JSON,代表國家轉讓 [其他]) 和大多數 — — 如果不是全部 — —­來自不同供應商的裝置類型可以利用它。

我們不會覆蓋在這篇文章的"推辦法"。這種方法依賴于對 Windows 推送通知服務 (WNS),它允許雲託管服務向 Windows 存儲應用程式發送未經請求的資料。此類應用程式不需要在前臺運行,且無保證的消息傳遞。有關使用 WNS 的資訊,請參閱 bit.ly/RSXomc

兩個專案

完整的解決方案需要兩個主要元件:伺服器端或 Web 服務專案 (可以部署在處所或在 Windows Azure),和用戶端的專案,其中包括基於新的 Windows 使用者介面 Windows 存儲應用程式。可以使用 Visual Studio 2012 創建這兩個專案。

基本上,有兩個選項用於生成 Web 服務專案:Windows 通信基礎 (WCF) 或 ASP.NET Web API,它是包含在 ASP.NET MVC 4。因為廣泛記錄公開通過 WCF 服務,為我們的方案中我們將使用 ASP.NET Web API 到表中,帶來真正擁抱 HTTP 概念 (Uri 和動詞) 的更現代的做法。此外,這一框架可以創建使用 HTTP 的更高級的功能,如請求/回應標頭和超媒體構造的服務。

在開發過程中,這兩個專案可以進行測試,一台電腦上。您可以下載了整個解決方案 archive.msdn.microsoft.com/mag201210AzureInsider

您的需要

最明顯的出發點是,Windows 8 是必需的它應該是不足為奇應該使用最新版本,可以在下載的 Visual Studio 創建專案 bit.ly/win8devtools

為伺服器端專案中,您將需要最新的 Windows Azure 的 SDK,包括必要的程式集和創建雲專案從 Visual Studio 中的模具。您可以下載此 SDK 和相關的模具 bit.ly/NlB5OB。此外,您還需要一個 Windows Azure 帳戶。可以在下載免費試用版 bit.ly/azuretestdrive

歷史上,已用於 SOAP 建築師的 Web 服務,但這篇文章將側重于體系結構的休息方式。簡而言之,其餘部分是便於使用、 攜帶小負載,需要任何特殊的工具。

在生成的 Web 服務時,開發人員還必須選擇資料交換格式。這一選擇通常是 JSON 和 XML 之間。JSON 使用基於 JavaScript 語言緊湊的資料格式。它是通常稱為 XML"含脂肪替代"因為它有一個小得多的語法和直接映射到用戶端應用程式中使用的資料結構。在我們的示例中,我們將使用 JSON 資料。

與這些所作的決定,我們準備好創建我們的 Web 服務。我們的目標是建立基於 HTTP 的服務,達到盡可能廣泛的用戶端,包括瀏覽器和行動裝置。

生成 Web 服務

讓我們開始以管理員身份啟動 Visual Studio 2012。下面是創建伺服器端的 Web 服務,使用 ASP.NET MVC 4 Web API 的步驟:

  1. 在檔功能表上按一下並選擇新建 |專案 (見圖 1)。
  2. 請選擇 Visual C# |範本類型的網站。
  3. 在頂部的下拉清單中選擇.NET 框架 4。
  4. 選擇 ASP.NET MVC 4 Web 應用程式。
  5. 輸入名稱的 web 服務和您選擇的位置。
  6. 按一下 [確定]。
  7. 嚮導會詢問您要選擇的專案範本。選擇 Web API 並確保視圖引擎剃刀 (預設值),如中所示圖 2
  8. Visual Studio 將生成各種檔。這可以壓倒性的但是我們只需要擔心一些檔,如中所示圖 3

New Project Dialog Box
圖 1 新建專案對話方塊

Project Template Dialog Box
圖 2 專案範本對話方塊

Solution Explorer for WebService
圖 3 解決方案資源管理器中的 web 服務

ValuesController.cs 是重要的因為它包含在 Windows 8 用戶端提交針對 Web 服務的 HTTP 要求時將執行的代碼。這是我們將在其中添加代碼,以返回 Windows 存儲應用程式所需的 JSON 資料。示的 ValuesController 類圖 4,由 Visual Studio 生成的它將繼承 ApiController,將返回已序列化併發送到用戶端,自動 JSON 格式的資料。

圖 4 ValuesController 類

public class ValuesController : ApiController
{
  // GET api/values
  public IEnumerable<string> Get()
  {
    return new string[] { "value1", "value2" };
  }
  // GET api/values/5
  public string Get(int id)
  {
    return "value";
  }
  // POST api/values
  public void Post([FromBody]string value)
  {
  }
  // PUT api/values/5
  public void Put(int id, [FromBody]string value)
  {
  }
  // DELETE api/values/5
  public void Delete(int id)
  {
  }
}

請注意,在方法圖 4— — 獲取、 發佈、 放和刪除 — — 將映射到特定創建、 讀取、 更新和刪除 (CRUD) 操作和 HTTP 謂詞由 Windows 存儲應用程式執行。 這是美麗的 ASP.NET Web API 框架:它自動路由儘量減少潛在的程式設計錯誤,用戶端直接向的 ValuesController 類中定義的方法使用的 HTTP 謂詞。

現成的隨時運行 web 服務專案。 ValuesController 類中的方法是一目了然:

// GET api/values
public IEnumerable<string> Get()
{
  return new string[] { "value1", "value2" };
}

請注意 Get 方法調用用戶端發出 HTTP 謂詞使用 URL HTTP://localhost:[port]/api/values Get 時。 為此演示中,而該代碼繪製同心圓基於從 Web 服務返回的顏色。 修改前面的代碼,如下所示:

// GET api/values
public IEnumerable<string> Get()
{
  return new string[] { "#0000FF", "#000000", "#FF0000",
    "#FFFF00", "#00FF00" };
}

正如您所看到的我們現在返回各種顏色的字串的陣列。我們創建的 Windows 存儲應用程式將作為實際顏色,專門為彩色同心圓呈現這些字串。

使用瀏覽器測試

它總是一個好主意來創建 Windows 存儲應用程式之前測試的 Web 服務。使用您喜歡的任何瀏覽器。

要測試從瀏覽器中的 Web 服務,請執行以下步驟:

  1. 在 Visual Studio 中,在調試功能表上按一下並選擇啟動調試。
  2. 您應該看到預設的起始頁,如中所示圖 5
  3. Visual Studio 選擇一個任意的埠,在這種情況下 58428 的通知。您的 Visual Studio 的實例使用的埠可能會有所不同。
  4. 你會記得,我們需要將"api/值"添加到 URL,以便獲取調用 Get 方法,意味著最終的 URL (在本例中) 應該是 HTTP://localhost:58428/api/values。這是一個內置的功能,當 Visual Studio 創建您的專案。您可以更改該映射,以滿足您的需要。
  5. 轉到位址 Visual Studio 欄並鍵入 HTTP://localhost:58428/api/values。請記住的埠號替換為您自己的值。
  6. 一個對話方塊將顯示類似中圖 6
  7. 按一下保存按鈕,然後在記事本中打開 values.json。
  8. 記事本將顯示返回的值。注意在圖 7 返回的資料是自動 JSON 格式,提供 ASP.NET Web API 框架。

Using Internet Explorer to Test the Web Service
使用瀏覽器來測試 Web 服務的圖 5

Internet Explorer Dialog Box
圖 6 互聯網資源管理器對話方塊

The JSON Data Returned by the Web Service
圖 7 通過 Web 服務返回的 JSON 資料

輸入 Windows 8

現在,我們已經成功地從我們的 Web 服務返回 JSON 資料,讓我們瞭解如何使用此資料從 Windows 存儲應用程式。目標是從 Web 服務讀取顏色,並畫同心圓基於 Web 服務返回的值。我們最後 Windows 存儲應用程式應產生圖像看起來像圖 8。您看到的顏色定義的 Web 服務。如果 Web 服務返回的顏色發生了變化,Windows 存儲應用程式將為您在中看到的同心圓反映這些顏色圖 8

The Running Windows Store Application
圖 8 的運行 Windows 存儲應用程式

您可以在 Web 服務專案中,同一解決方案中創建的 Windows 存儲應用程式也可以專門為 Windows 8 的用戶端啟動 Visual Studio 的一個新實例。我們會為 Windows 存儲應用程式管理員身份啟動 Visual Studio 的一個新實例。為此,請按照下列步驟 (見圖 9):

New Project Dialog Box
圖 9 新建專案對話方塊

  1. 以管理員身份啟動 Visual Studio 的第二個實例。
  2. 在檔功能表上按一下並選擇新建 |專案。
  3. 請選擇 Visual C# |Windows 存儲為範本的類型的。
  4. 在頂部的下拉清單中選擇.NET 框架 4。
  5. 選擇空白 App (XAML)。
  6. 輸入名稱 Windows8Client 和您選擇的位置。
  7. 按一下 [確定]。

當您完成這些步驟時,導航到視圖功能表並選擇解決方案資源管理器 (請參閱圖 10),並打開 MainPage.xaml.cs 檔。

Solution Explorer for Windows8Client
圖 10 解決方案資源管理器為 Windows8Client 的

調用 Web 服務

我們準備去添加將從 Windows 存儲應用程式調用 Web 服務的代碼。Windows 存儲應用程式會發出針對 Web 服務的 Web 請求。

為了支援 Web 請求,MainPage.xaml.cs 將修改,如下所示:

  • 將為內置的網格控制項添加載入的事件。
  • 載入的事件將提交到 Web 服務調用的非同步 Web 請求。為此目的,將使用 HttpClient 類。
  • 若要從 Web 服務的顏色字串轉換真正的顏色,將添加調用 CircleColorFromString 方法。
  • 若要繪製的同心圓,我們將添加調用 AddCircle 方法。

請執行下列步驟來發出針對 Web 服務的 Web 請求:

  1. 按右鍵 MainPage.xaml,選擇視圖設計器。
  2. 添加 GridLoadedEvent 和畫布控制項,如下所示 (畫布是我們就會在其中繪製圓):
<Grid Name="maingrid"
      Background="{StaticResource
                   ApplicationPageBackgroundThemeBrush}"
      Loaded="GridLoadedEvent">
  <Canvas Name="myCanvas" Background="White"/>
</Grid>
  1. 3.按兩下 MainPage.xaml.cs。此時將顯示為 MainPage.xaml.cs 代碼隱藏。
  2. 4.為了支援不同的命名空間添加所需的代碼,包括頂部的 MainPage.xaml.cs 以下參考資料:
using System.Net.Http;          // for HttpClient()
using Windows.Data.Json;        // for parsing JSON Array data
using Windows.UI.Xaml.Shapes;   // for the Ellipse object
using Windows.UI                // for the Color class
  1. 5.添加支援的常式繪製圓和解析 JSON 字串資料,Web 服務發送的。 編輯 MainPage.xaml.cs 中的代碼,如中所示圖 11

圖 11 MainPage.xaml.cs

public sealed partial class MainPage : Page
  {
    // [ Generated code omitted for brevity ]
    private void AddCircle(Color color, int diameter, int t, int l)
    {
      //
      // Build a circle using the attributes provided as parameters.
//
      Ellipse newColoredCircle = new Ellipse();
      newColoredCircle.Fill = new SolidColorBrush(color);
      newColoredCircle.StrokeThickness = 1;
      newColoredCircle.Stroke = new SolidColorBrush(color);
      newColoredCircle.Width = diameter;
      newColoredCircle.Height = diameter;
      //
      // Add the circle to the Canvas control.
//
      myCanvas.Children.Add(newColoredCircle);
      Canvas.SetTop(newColoredCircle, t);
      Canvas.SetLeft(newColoredCircle, l);
    }
    Color CircleColorFromString(string rgb)
    {
      //
      // Convert the string-based hex values
      // into a Color object and return to caller.
//
      Color ringColor = new Color();
      byte a = 255;
      byte r = (byte)(Convert.ToUInt32(rgb.Substring(1, 2), 16));
      byte g = (byte)(Convert.ToUInt32(rgb.Substring(3, 2), 16));
      byte b = (byte)(Convert.ToUInt32(rgb.Substring(5, 2), 16));
      ringColor = Color.FromArgb(a, r, g, b);
      return ringColor;
    }
    private async void GridLoadedEvent(object sender, 
      RoutedEventArgs e)
    {
      //
      // Retrieve colors from Web service.
//
      var client = new HttpClient();
      client.MaxResponseContentBufferSize = 1024 * 1024;
      //
      // Asynchronously call into the Web service.
//
      var response = await client.GetAsync(
        new Uri("http://localhost:58428/api/values"));
      var result = await response.Content.ReadAsStringAsync();
      //
      // Parse the JSON data
      //
      var parsedResults = JsonArray.Parse(result);
      //
      // Build concentric circles, repeating colors as needed
      //
      const double startingPercentage = 1.0;
      const double desiredCircleCount = 50.0;
      for (int i = 0; i < desiredCircleCount; i++)
      {
        Color circleColor = CircleColorFromString(
          parsedResults[i % parsedResults.Count].GetString());
        int circleDiameter = Convert.ToInt32((startingPercentage –
          (i / desiredCircleCount)) * this.RenderSize.Width / 2.0);
        int top = Convert.ToInt32((this.RenderSize.Height -
          circleDiameter)/2.0);
        int left = Convert.ToInt32((this.RenderSize.Width -
          circleDiameter)/2.0);
        AddCircle(circleColor, circleDiameter, top, left);
      }
    }
}

現在測試應用程式,這是很簡單:

  1. 返回到 web 服務專案在 Visual Studio 中,從調試功能表中選擇啟動調試。
  2. 驗證啟動瀏覽器。您現在可以開始使用 Windows8Client 應用程式。
  3. 返回到 Visual Studio 中的 Windows8Client 專案,請選擇從調試功能表上的啟動調試。
  4. 驗證是否出現 Windows 存儲應用程式,如中所示圖 8

將 Web 服務部署到 Windows Azure

一旦已創建和本地測試的 Web 服務下, 一個合乎邏輯的步驟是將它部署到雲為目的的可擴充性。這允許您更改分配給 Web 服務的計算能力 — — 及其成本 — — 作為請求從 Windows 8 的設備的數量增加或減少。Visual Studio 提供了不同的方法來部署到 Windows Azure 的 ASP.NET Web API 專案和唯一的前提是要添加到 Web 服務解決方案的雲服務專案。請遵循這些步驟:

  1. 解決方案名稱中,按右鍵並選擇添加 |新的專案。
  2. 請選擇 Visual C# |雲計算作為專案範本 (圖 12)。
  3. 在頂部的下拉清單中選擇.NET 框架 4。
  4. 選擇 Windows Azure 雲服務 Visual C#。
  5. 輸入名稱 WindowsAzureCloudService 和您選擇的位置。
  6. 按一下 [確定]。
  7. 現在回到解決方案資源管理器。找到新的專案在解決方案中,用滑鼠右鍵按一下角色節點。請選擇添加 |Web 專案的作用。
  8. 查找以前創建的 web 服務專案。選擇它並按一下確定。
  9. 現在,您應該看到列在角色節點下,如中所示的 web 服務專案圖 13
  10. 您可以更改各種部署參數為 web 服務角色之前將其部署到 Windows Azure,如它的去向要承載的虛擬機器 (VM) 的大小和支援它的實例數。審查這些參數、 web 服務角色的節點上按一下滑鼠右鍵並選擇屬性。對話方塊中的一個像圖 14 顯示。特別注意的實例計數和 VM 大小參數,它們將決定消費率一旦部署了作用。有關 Windows Azure 定價計算實例的詳細資訊,請訪問 bit.ly/SnLj68
  11. 在 Windows 上按右鍵­AzureCloudService 專案,並選擇包。保持服務和生成的配置參數,預設選擇,然後按一下包按鈕。此操作將生成兩個檔:Windows­AzureCloudService.cspkg 和 ServiceConfiguration.Cloud.cscfg,它們必須通過入口網站創建 Windows Azure 雲計算服務。請注意專案可以直接部署從 Visual Studio 中,但我們不會覆蓋此方法在這裡。
  12. 登錄到您的 Windows Azure 帳戶通過打開 URL manage.windowsazure.com,然後按照說明在 bit.ly/R15VNj 創建新的雲服務和上載兩個生成的檔。
  13. 根據您使用的雲服務的名稱,您新的 ASP.NET Web API 將可在 HTTP://{cloudservicename}.cloudapp。net/空氣污染指數數值。
  14. 此 URL,為 Windows 存儲應用程式和完成。

Adding a Cloud Service Project to the Web Service Solution
圖 12 雲服務專案添加 Web 服務解決方案

Adding the WebService Project to a Cloud Service Role
圖 13 向雲服務角色添加 web 服務專案

Windows Azure Deployment Properties for the WebService Role
圖 14 Windows Azure 部署屬性對於 web 服務角色

在雲計算

通過使用 ASP.NET Web API,它是極其簡單,以支援應用程式非同步消耗和接收資料的 Web 服務通過使用其他命令。Visual Studio 2012 和.NET 框架 4.5 的庫,使它非常簡單,發出對 Web 服務的非同步 Web 請求。最後但並非最不重要的是,與 Windows Azure 的開發環境的集成允許開發人員快速部署到雲計算的服務部分,雲計算的可擴充性和全球基礎設施能力的利用提供了。

Bruno Terkaly 是 Microsoft 開發人員宣傳員。他深入的知識來自于多年的經驗,編寫代碼使用各種各樣的平臺、 語言、 框架、 Sdk、 庫和 Api。他花時間編寫代碼,博客,給現場演示上構建基於雲計算的應用程式,特別使用 Windows Azure 平臺。

Ricardo Villalobos 是超過 15 年的經驗,在設計和創建的公司申請在供應鏈管理行業經驗豐富的軟體架構師。他從達拉斯大學商業管理舉行幾個技術認證,以及碩士學位,Microsoft 為雲建築師 Windows Azure CSV 孵化組中工作。

由於以下的技術專家對本文的審閱:Robert Green