本文章是由機器翻譯。

.style0 { vertical-align:bottom; } .style1 { vertical-align:bottom; } .style2 { vertical-align:top; } .style3 { vertical-align:top; } .style4 { vertical-align:top; } .style5 { vertical-align:top; } .style6 { vertical-align:top; } .style7 { vertical-align:top; } .style8 { vertical-align:top; } .style9 { vertical-align:top; } .style10 { vertical-align:top; } .style11 { vertical-align:top; }

新型應用程式

Windows Azure 移動服務為新型應用程式提供助力

Rachel Appel

 

Rachel Appel無論你的應用程式發佈面向的是哪個平臺,Windows Azure 移動服務 (WAMS) 都可作為「一控全域」的後端。它是 Windows Azure 平臺的核心元件,為跨平臺的新型應用程式和 Web 開發提供後端支援。在本文中,我將介紹如何設置 WAMS,使其能夠在 Visual Studio 中工作,概述 WAMS API 並解釋使用 WAMS 構建新型應用程式所必需的編碼。

WAMS 的跨平臺體系結構

可用於管理資料和為應用程式提供後端支援的 Windows Azure 服務有很多,而應用程式使用多個 Windows Azure 服務的情況也並不罕見。下面是一些可用的服務:

  • WAMS:一套跨平臺且功能齊全的後端服務及資源,專門用於快速構建應用程式。
  • SQL Azure:一款同樣流行的 SQL Server,但位於雲中,提供了一個便於使用的 Web 管理介面。它是規模較小的初創公司、企業和 ISV 的經濟高效之選。
  • Windows Azure 表存儲:以 NoSQL 的方式動作表格及類表格資料。
  • Windows Azure 二進位大型物件 (BLOB) 存儲:以高度可擴展的方式將資料封裝為鍵/值對形式並存儲在雲中,無結構化資料之憂及限制。
  • Windows Azure 網站:除網站託管之外,Windows Azure 網站還可以運行 ASP.NET 和 ASP.NET Web API。由於避免了大量的體系結構重構工作,使得其成為基於 HTTP 的舊網站、程式和應用的極佳選擇。

應用程式的體系結構取決於需求。如果應用程式需要存儲大量(如數十或數百 GB 的資料)的媒體或二進位內容,使用 Windows Azure BLOB 存儲可能是更好的選擇。對於大多數唯讀寫帶有少量配圖的文本資料的應用程式來說,WAMS 是一個簡潔、易用的解決方案。許多應用程式必須處理舊資料,因此從 SQL Server、SQL Server Compact (SQL CE) 或任一 Microsoft SQL 系列資料庫直接遷移到 SQL Azure 可能是最好的方式(如果需要用 DBA 來管理這些資料)。

對大多數應用程式而言,WAMS 非常合適,這是因為它不僅具有資料存儲功能,而且還包含一整套基於資料庫構建的後端服務,可快速實現常見的應用程式基礎結構方案(如推送通知和身份驗證)。

WAMS 的核心服務

WAMS 核心服務的功能包括:

  • 資料:毫無疑問,存儲和運算元據是所有應用程式都必不可少的,因而 WAMS 亦為此提供了支援。每一項移動服務的背後都有一個為其提供支援的 SQL Azure 資料庫。
  • 消息傳送:使用者想要瞭解最新動向,因而推送通知變得日益重要。隨著應用程式變得越來越複雜、直觀和方便使用(換句話說,更富現代氣息),推送消息和即時通信等功能變得司空見慣。幸運的是,使用 WAMS 中的推送通知就像調用發送 toast(作業系統右上角或右下角的微型彈出消息)通知一樣簡單:

push.wns.sendToastText04(channel, { text1: item.text });

  • 身份驗證:保護資料,尤其是使用者資料,與資料本身同等重要。 新型應用程式的一項基本功能是通過流行的 Web 網站(如 Facebook 或 Twitter)進行身份驗證,因此,WAMS 允許使用以下任一身份提供程式進行身份驗證:
  1. Microsoft Account(之前稱作 Windows Live ID 的身份檢查器提供者)
  2. Facebook login
  3. Twitter login
  4. Google login

WAMS 提供了若干用於 Windows 系列應用程式開發的庫,其中包括用於託管用戶端的 Windows 運行時 (WinRT) 庫,用於核心服務、身份驗證和消息傳送等所有操作的 Windows JavaScript 庫 (WinJS) 用戶端庫和 Representational State Transfer (REST) API。 此外,WAMS 甚至還提供了 iOS 和 Android 用戶端庫,實現用於跨平臺同等訪問。

在 Windows 應用商店專案或 Windows Phone 專案中使用 WAMS API

無論你構建的是 Windows 應用商店應用程式還是 Windows Phone 應用程式,其代碼幾乎相同,而 WinJS 端上的 JavaScript 代碼更是驚人的相似。 只要擁有適當的開發工具並安裝和配置好 WAMS(有關更多相關資訊,請參閱 bit.ly/NAAQz8),就很容易寫出訪問移動服務中物件和資料的代碼,但其不同于傳統的用戶端/伺服器或 n 層應用程式開發。 這是由 WAMS 與應用程式的集成方式造成的:應用程式模型中的某些更改可能會導致底層資料結構發生更改。 換句話說,你可以丟棄許多傳統的 SQL 資料定義語句而只修改某個類成員,然後重新編譯、運行應用程式,並驗證資料庫級別上的更改。 現如今,用於資料庫維護(如驗證腳本或設置資料限制)的語法方面,JAVAscript 已取代了 SQL 的位置。 由於能夠通過應用程式、命令提示符和 Web 管理工具輕鬆編寫更改資料庫的腳本,使得應用程式的構建過程得以縮短。

Microsoft.WindowsAzure.MobileServices 命名空間提供了對移動服務或其底層 SQL Azure 資料庫中物件的標準化訪問。 下面的代碼示例創建了一個 MobileServiceClient 實例:

public static MobileServiceClient MobileService = new MobileServiceClient(   "https://your-very-own-service-url.azure-mobile. net/",   "your-very-own-key-that-is-a-gigantic-string-of-characters-and-numbers" );

正如你看到的那樣,MobileServiceClient 建構函式的參數為 WAMS 應用程式的 URL 和金鑰。 要查找 URL 和金鑰,請登錄 Windows Azure 門戶轉至移動服務,然後按一下儀表板功能表項目左側的雲圖示。

在上面的代碼示例中,MobileServiceClient 類的行為有點像連線物件,但沒有 SqlConnection 物件時代那些煩擾的 open 和 close 方法。 MobileServiceClient 類會代你管理連接。 如果將資料設為公共用途,則無需調用 MobileServiceClient.login 方法,亦可訪問表、執行查詢和對資料進行排序。 當然,更複雜或安全要求更高的操作可能需要憑據。

擁有有效的 MobileServiceClient 類實例後,即可使用 GetTable<T> 與底層的 WAMS 表進行交互:

private IMobileServiceTable<Person> personsTable =   MobileService.GetTable< Person>();

IMobileServiceTable<T> 中的類型參數 T 會導致編譯器檢查該參數的相關屬性及資訊(在本例中,該參數為圖 1 中的 Person 類),檢查方法是將其映射到資料庫級別的底層表。 這使得你能夠在開發期間添加或修改屬性並于運行時在雲中反映相應的架構更改,從而在代碼與資料庫之間建立一種更緊密的共生關係。 但是,並非代碼中的每個更改都會導致資料庫級別的架構發生自動更改。 例如,在圖 1 的代碼中添加一個屬性會在表中創建一個新列,但刪除已有屬性並不會引發刪除操作。

圖 1 Person 類

// Data model/class code. public class Person {   public int Id { get; set; }   public string Name { get; set; }   [DataMember(Name = "Birthday")]    public DateTime Date { get; set; }   public string Picture { get; set; }   public string Notes { get; set; } }

GetTable<T> 返回一個 IMobileServiceTable 物件,該物件代表 WAMS 中實際的底層表,並且包含插入、更新、刪除和排序服務的方法,如下所示:

// Perform delete asynchronously where item is of type Person, see Figure 1. await itemsTable.DeleteAsync(item); // Select specific records with LINQ query var people =   personsTable.Select(p => p.Birthday > DateTime.Now.AddDays(14));

你可以通過創建一個與表及成員名稱相匹配的自訂類來在代碼中構建自己的資料層。 這種技術叫作「慣例優先于配置」,是一種能夠縮減臃腫的 XML 配置代碼以提高命名中連續性和一致性的方法,它可產生更少的代碼,提高可維護性。 例如,圖 1 中的類和架構演示了該用戶端類代碼到 WAMS 表及其成員的映射。

圖 1 中的代碼會創建圖 2 所示的資料庫架構。

圖 2 慣例優先于配置與類代碼和資料庫架構名稱相匹配

資料行 類型
識別碼 SQL Bigint
「名稱」 字串
日期 DateTime
Categories TableAdapter(類別 TableAdapter) 字串
備註 字串

WAMS 根據代碼中屬性的資料類型來推斷資料類型。 但是,有些類型,特別是圖像和二進位資料,無法以資料屬性工作表示。 這意味著,如需存儲圖像,則應使用 Windows Azure BLOB 存儲,這是因為它的可擴充性更高、代價更低,且性能遠遠優於其替代方法(即使用 Base64 將圖像編碼為字串,然後將其存儲在 WAMS 表中)。 Windows Azure BLOB 存儲具有 REST API 和託管 API,因此,開發人員可以方便地訪問跨平臺服務和首選項。

要執行插入、更新或刪除操作,只需創建一個自訂物件的實例,然後調用 IMobileServiceTable 物件中的相應方法即可:

Person person = new Person {   Name = "Alan Turing",   Birthday = DateTime dte = new DateTime(1912,6,23),   Picture = base64string, // Image encoding done elsewhere in code.    Notes = "A father of modern computer science. There is a test " +     "named after him that I fail regularly"}; await personsTable.InsertAsync(person);

對 InsertAsync 的調用顯然是非同步,因而該調用不會阻塞 UI 代碼的運行,這使得你可以在後臺管理資料,而不幹擾使用者的活動。 Windows 應用商店應用程式和 Windows Phone 應用程式預設以非同步方式工作,這是因為你不能總是指望連接非常可靠。

如果操作的是 XAML,則可通過調用 IMobileServiceTable 物件的 ToListAsync 方法來將資料繫結至表。 該方法會將資料預備好,然後將其返回到一個可將 WAMS 表輕鬆綁定至 XAML ListView 元素的物件中,如下面的代碼示例所示:

var results = await todoTable.ToListAsync(); items = new ObservableCollection<TodoItem>(results); ListItems.ItemsSource = items;

上面的代碼類似于 Microsoft .NET 框架中傳統的資料繫結代碼。 如需手動遍歷資料而非執行資料繫結,也可調用 IMobileServiceTable 物件的相關方法來返回 IList<T> 或 IEnumerable<T>。

管理 WAMS 的高級功能

毫無疑問,你需要管理和維護移動服務及其資料、安全性和與後端維護相關的所有日常工作,因為這類工作不該全部放在應用程式中完成。 幸運的是,在後端管理工作方面,WAMS 為你提供了一些選擇:

  • 命令列工具:無論採用何種平臺進行開發,這都是個非常好的選擇;只要下載並安裝了命令列庫(有關更多資訊,請參閱 bit.ly/14Q49bi),即可使用任何命令提示符。
  • Web administration:也稱作 Windows Azure 門戶,非常適合跨平臺後端開發,你可以借助該工具線上完成所有基本工作——創建資料庫、運行伺服器端腳本、管理服務、管理安全性等等(可通過 Windows Azure 主站 (bit.ly/4yqVhP) 訪問該門戶)。
  • SQL Server Management Studio一款經典的 Microsoft 資料庫管理工具,可以用它來連接和管理移動服務的後端資料庫(有關更多資訊,請參閱 bit.ly/VdqpZH)。

WAMS 包含一個簡潔但完整的 WAMS 伺服器端腳本參考示例 (bit.ly/XvsVec)。 可通過命令列工具或 Windows Azure 門戶線上發送命令。 在命令提示符下,只需輸入命令 azure mobile 即可查看所有可用命令的清單,輸入 azure mobile list 則可列出所有的移動服務。

與應用程式代碼一樣,伺服器端腳本函數通過命名約定「登記」到一張表中,因此,腳本必須匹配插入、讀取、更新和刪除操作的方法簽名。 下面是 JavaScript 的資料操作腳本簽名:

  • 插入函數: insert (item, user, request) { ... }
  • 讀取函數: read (query, user, request) { ... }
  • 更新函數: update (item, user, request) { ... }
  • 刪除函數: del (id, user, request) { ... }

請注意,所需的一切資訊都封裝成了方法的參數,即資料行、使用者身份和請求本身。 這既可實現行級別的安全性,又可運行任意類型的伺服器端規則(如在驗證活動發生時進行資料驗證)。

例如,你可能需要通過驗證來限制傳入字串(用於插入操作)的長度。 可用以下代碼實現該功能:

function insert(item, user, request) {   if (item.text.length > 20) {     request.respond(statusCodes.BAD_REQUEST,     'The length of the input text must be less than 20');   } else {     request.execute();     } }

你可在 Windows Azure 門戶上修改這些腳本,也可在你喜歡的文字編輯器中進行這些修改並將其保存為帶 .js 副檔名的檔(如 person.insert.js)。 然後,通過在命令列上執行採用以下語法和簽名的命令上傳準備好的腳本:

azure mobile script upload <service-name> table/<table-name>.<operation>.js

下面是用來上傳上述示例腳本的命令(其中,Notable 為服務名稱,person 為表名):

azure mobile script upload NotablePeople table/person.insert.js

正如你預料的那樣,可以使用任意用戶端語言中的 try/catch 語句捕捉驗證錯誤的結果。

近來,隨著伺服器端 JavaScript 趨勢的興起,SQL 開發人員可能會感到落寞,但值得欣慰的是,他們可以在 mssql 腳本物件中使用 SQL,即使與 JavaScript 混用也行:

mssql.query('select * from people', {   success: function(results) {     console.log(results);   } });

如果你所在的企業大量採用 SQL 進行開發,則這一特性尤為有用,因為其與 JavaScript 的動態本質有相當大的不同。

回顧一下,WAMS 是一套完整的用於快速構建跨平臺應用程式的後端服務。 除 SQL Azure 外,所有的 Windows Azure 服務都自動實現了 REST 友好的 URL,而 REST 又是跨平臺的,因而你沒必要為確保應用程式體系結構支援未來的新用戶端設備或使用者代理而擔憂。 此外,WAMS 不僅擁有強大的 Web 管理和命令列工具(使用 WAMS 時無需在用戶端上安裝大量軟體),而且還提供了簡單易用的 API,涵蓋了從基本的資料存儲到大量電子郵件與推送通知的一切內容。

Rachel Appel 是 Microsoft 在紐約市的開發推廣人員。您可以通過 rachelappel.com 網站與她聯繫,或者通過電子郵件 (rachel.appel@microsoft.com) 與她聯繫。您還可以在 Twitter 上(網址為 twitter.com/rachelappel)留意她的最新更新。

衷心感謝以下技術專家對本文的審閱: Paul Batum (Microsoft)
Paul Batum 是 Microsoft 的一名專案經理,負責 Windows Azure 移動服務方面的工作。 他的工作重點是方便移動開發人員在其應用程式中添加雲計算功能。 可通過 pbatum@microsoft.com 與他聯繫。