2018 年 1 月

第 33 卷,第 1 期

本文章是由機器翻譯。

資料點 - 建立 Azure Functions 以與 Cosmos DB 互動

Julie Lerman

Julie Lerman在我最後一個資料行,我會帶您完成建立簡單的通用 Windows 平台 (UWP) 應用程式 — 呼叫 CookieBinge 遊戲 — 時基本上藉口我瀏覽使用 Entity Framework Core 2.0 (EF 核心) 在裝置繫結Windows 10 應用程式。新增可攜式 SQLite 等資料庫的提供者完成圖片,讓這種可能性。

應用程式,並在其目前的狀態,遊戲的分數本機儲存其中遊戲  蝭  使用 EF 核心 2.0 SQLite 資料庫將資料保存在裝置上。中的最後一篇文章,我承諾此遊戲的下一個反覆項目可讓使用者與其他遊戲玩家在網際網路上共用該資料。若要達成這個目標,使用兩個 Azure 項很棒的功能:Azure Cosmos DB 和 Azure 函式。

關於 Azure Cosmos DB 位元

Azure 的 Cosmos DB 是新一代的項目開始身為 Azure 文件 DB — 我所撰寫關於多次,此資料行中的技術。「 Microsoft Azure DocumentDB 的概觀 > (msdn.com/magazine/mt147238) 在 2015 年 6 月之後接的兩個的多個發行項後端的 Node.js 伺服器應用程式開發介面透過一 Aurelia Web 應用程式當做我使用的位置。

DocumentDB 逐漸發展變成一些特殊的功能與全域散發的資料庫中。除了與您可以將它發佈全域簡易,其一致性模型已經重新編制,使其沒有可從中選擇只強式且最終的多個。之間的兩種極端之間,使用者現在也可以選擇繫結失效,工作階段或一致的前置詞。有許多更重要的功能,可支援資料存放區和文件資料庫現在已加入由數項其他資料模型,可透過 MongoDB Api、 圖形資料庫、 資料表 (索引鍵/值組) 和資料行的資料存放區存取的文件。所有這些模型都是 Cosmos DB 概括性底下。事實上,如果您在 Azure DocumentDB,它是自動切換至 Azure Cosmos 資料庫,可讓您受益於 Cosmos DB 帶來的新功能的所有現有的文件資料庫。您可以閱讀更深入了解所開始的 Cosmos DB cosmosdb.com

和 Azure 函式的位元

我要使用 Cosmos DB 儲存 CookieBinge 分數。不過,而不是撰寫所有程式碼自行使用文件 DB Api,我會充分利用 Azure 的另一個相對新功能:Azure 的函式。Azure 的函式是 「 無伺服器計算 「 Microsoft 供應項目。我一直有關該片語 skeptic 因為計算仍然在伺服器上...只要不是我的伺服器。但有最後會有機會處理 Azure 函式,現在有很棒的相對值,所需的概念。Azure 函式可讓您專注於您想要執行應用程式中,而它會負責跨領域的考量,如部署中,支援應用程式開發介面和其他功能,例如資料儲存體連接或傳送電子郵件的實際邏輯。我不完全了解這嗎,直到我希望是,當我 CookieBinge 應用程式準備這項功能,請遵循我路徑,您也可以讓您 aha 一點時間。

準備建置第一個 Azure 函式

有三種方式,來建置 Azure 函式。其中一個是使用 Visual Studio 2017 中的工具。另一個是直接在 Azure 入口網站中。您也可以使用 Visual Studio 程式碼中使用 Azure 命令列介面 (CLI) 的組合。我決定啟動我的學習透過入口網站,因為它逐步我所有我所需的步驟。另一個好處是工具的,而不需,Visual Studio 2017 協助,我已強制認為移動組件的所有相關有點困難。我認為我收到更加更深入了解該方法。當然,還有許多神奇資源,Visual Studio 2017,執行此作業,但是我喜歡使用入口網站的其他一件事就是 Web 架構,因此,跨平台的選項。請記住,雖然您可以將您函式程式碼和資產從原始檔控制部署至 Azure,您直接在入口網站中建立的任何項目都必須下載到電腦 (簡單的工作),並從該處,請推送至您的儲存機制。

如果您想要跟著做,且還沒有 Azure 訂用帳戶,我很高興通知您您可以取得可用的訂用帳戶,並不是只針對簡短試用版。某些 Azure 產品中,一年是免費,有幾個數十個永遠都可用。移至azure.com/free進行設定。我使用我已試驗各種 Azure 每月信用額度的 Visual Studio 訂閱的一部分取得的帳戶。

建立之前的函式,我需要定義目標。我想要能夠我的應用程式:

  • 保存不只是某些使用者資訊和分數,以及日期在網站上儲存使用者的分數,但也裝置類型的遊戲已播放。
  • 允許使用者擷取其最高的分數,跨所有裝置進行遊戲。
  • 可讓使用者擷取所有使用者的最高的分數。

我不打算陷入困境、 導致這一課向下的事項,例如建立和驗證帳戶,但當然您需要的真實世界。我的目的是告訴您 Azure 函式以及,從 UWP 應用程式互動。

在 Azure 入口網站中建立 Azure 的函式

Azure 的函式會分組可讓您定義及設定共用其組函式的函式應用程式中的服務。因此,我會先建立新的函式應用程式。在 Azure 入口網站中,按一下 [新增],篩選上 「 函式應用程式 」 方式輕鬆地尋找該選項。按一下函式應用程式中的結果清單,然後建立,會提示您填寫某些中繼資料,例如您的應用程式的名稱。我名為地雷 cookiebinge.azurewebsites.net。因為這是只是簡單的示範,我將會接受其餘的 [建立] 頁面上的預設值。以方便日後加入至新的函式應用程式存取,請檢查釘選到儀表板選項,然後建立按鈕。花費僅約 30 秒的我新函式的應用程式的部署完成。

現在您可以加入某些函式至函式應用程式。支援的先前所述的目標清單,將會建立函式。Azure 函式服務有一組預先定義的 (且相當豐富的) 的事件,它可以回應,包括 HTTP 要求、 變更中 Cosmos DB 資料庫或 blob 或佇列中的事件。我想要從 UWP 應用程式呼叫這些函式,因為我想回應透過 HTTP 傳入要求的函式。入口網站提供時光靠中以各種語言的範本:Bash、 批次、 C#、 F #、 JavaScript、 PHP、 PowerShell、 Python 和 TypeScript。我將使用 C#。

若要建立函數應用程式內的第一個函式,請按一下函式標頭旁邊的加號。您會看到按鈕,建立預先定義的函式,但如果向下捲動以下這些按鈕時,您會看到的連結,以建立自訂函式。選擇的選項,您會看到範本選項以填滿的可捲動方格中所示圖 1。HTTP 觸發程序 – C# 應該會在該清單的頂端,且您應該選取的項目。

建立新的自訂 Azure 函式的範本清單中的位元
圖 1 位元的清單範本建立新的自訂 Azure 函式

指明此函式,然後按一下 [建立] 按鈕。我名為採擷 StoreScores。

入口網站將使用一些預設程式碼建立函式,以便查看結構的方式。檔案,稱為 run.csx 內建函式 (請參閱圖 2)。您可以有額外的邏輯中支援的檔案,但,更進階比所需的這個第一個查詢。

新 HTTPTrigger 的預設函式邏輯
圖 2 新 HTTPTrigger 的預設函式邏輯

在範例中的唯一方法被呼叫執行,也就是 Azure 會呼叫此函式的 HTTP 要求的回應中。它有一個參數,擷取要求,另一個用於轉送記錄的資訊。

在範例中,您可以看到函式會尋找名稱,表示內送資料,並且函式有足夠的彈性,來搜尋和要求主體中的查詢參數。如果找不到名稱,此函數會傳回 HttpResponseMessage 使用易懂的錯誤訊息,否則會在回應中傳回"Hello [名稱]"。

自訂互動 Cosmos DB 函式

函式的目標是將內送的資料儲存到 Cosmos DB 資料庫。以下是最特別的開始位置。沒有需要建立連接和命令和其他程式碼來執行此工作。Azure 的函式,都能夠輕鬆地整合其他 Azure 的產品數目,和 Cosmos DB 是其中一個。

在 [函數] 清單中,您應該會看到新的函式和其下的三個項目。其中一個這些項目是整合。選取,然後您會看到部分中顯示的表單圖 3。請注意,它會提到的觸發程序是在 HTTP 要求,並輸出傳回透過 HTTP 的項目。我想要傳回成功或失敗的訊息,因為我想要保留該 HTTP 輸出。但我也想要加入具有 Cosmos DB 集合做為其目的地的輸出。

定義函式整合點
圖 3 定義函式整合點

若要這樣做,請按一下新的輸出,會顯示圖示的清單。向下一個捲動呼叫 Azure Cosmos DB,選取它,然後再進一步向下網頁上您會看到選取的按鈕。您知道要執行的工作。(按一下該按鈕) !

若要設定這項整合螢幕取得預先填入預設值。文件的參數名稱代表您將使用 run.csx 中的參數。我將會保留為預設名稱,outputDocument。接下來的 Cosmos DB 資料庫和該資料庫中,以及連線至 Cosmos DB 帳戶內的集合名稱所在的資料庫。您也會看到一個核取方塊會自動為您建立資料庫。我已經建立,所以我要使用其中一種,但是我讓建立新的資料庫與集合,稱為 Binges 該帳戶中名為 CookieBinge 我函式的幾個 Cosmos DB 帳戶。圖 4示範如何我已填寫此表單前儲存輸出定義。因為我標示的核取方塊,以建立資料庫與集合,這些將會建立對我而言,但不是儲存輸出時,才。當函式會先嘗試將資料儲存到資料庫,並看到不存在時,函式會動態建立資料庫。

定義為輸出的 Cosmos DB 函式
圖 4 做為輸出的 DB Cosmos 定義函式

自訂 Run.csx

現在就可以重新定義函式程式碼開始。新版本的函式必須要有傳入的 JSON 物件符合這個 BingeRequest 類別中,我加入 run.csx 檔案 Run 方法如下:

public class BingeRequest{
  public string userId {get;set;}
  public string userName {get;set;}
  public string deviceName {get;set;}
  public DateTime dateTime {get;set;}
  public int score{get;set;}
  public bool worthit {get;set;}
}

但這不是我想要儲存,因為我想要擷取一個屬性的資料相同的結構 — 的日期和時間資料登入資料庫。我將會執行,使用第二個類別,BingeDocument,繼承自 BingeRequest,藉此繼承其所有屬性,以及新增名為一個屬性記錄。建構函式接受填入的 BingeRequest 和記錄的值設定之後,它會將 BingeRequest 值傳送至其本身的屬性:

public class BingeDocument:BingeRequest
  {     
    public BingeDocument(BingeRequest binge){
    logged=System.DateTime.Now;
    userId=binge.userId;
    userName=binge.userName;
    deviceName=binge.deviceName;
    dateTime=binge.dateTime;
    score=binge.score;
    }
    public DateTime logged{get;set;}
  }

這些類型在位置中,執行方法可以利用其中。圖 5顯示 run.csx,包括預留位置 BingeRequest 和 BingeDocument 類別稍早所述修改過的清單。

讓我們來剖析新的執行方法。其簽章會要求及 TraceWriter 如同原始簽章,但現在它也具有名為 outputDocument 非同步輸出參數。輸出參數的結果會是什麼,就會取得推送至 Cosmos DB 輸出定義。請注意,其名稱符合輸出中的參數名稱中的輸出組態圖 4。TraceWriter 讓我的程式碼視窗下方的記錄視窗的訊息輸出。我將介紹這些最後,但就像以往,而不讓您偵錯 Ide。無法取得我不正確,不過。程式碼視窗會在剖析正在處理中,語言令人讚嘆和儲存時,所有的編譯器錯誤,也就是非常詳細,也會取得偵錯視窗的輸出。它也會等當您輸入左括號中插入右括號。事實上有令人驚嘆的數字編輯器功能。例如,若要查看長串的編輯器功能,其中您可以利用 [編輯器] 視窗上按一下滑鼠右鍵。

圖 5 新 run.csx 檔案擷取 Binge,並將其儲存到輸出,Cosmos DB

using System.Net;
public static async Task<HttpResponseMessage> Run(HttpRequestMessage req,
  TraceWriter log,    IAsyncCollector<object> outputDocument)
{
  BingeRequest bingeData =  await req.Content.ReadAsAsync<BingeRequest>();
  log.Verbose("Incoming userId:" + bingeData.userId);
  var doc=new BingeDocument(bingeData,log);
  log.Verbose("Outgoing userId:" + doc.userId);
  await outputDocument.AddAsync(doc);
  if (doc.userId !=" " ){
    return req.CreateResponse(HttpStatusCode.OK,$"{doc.userId} was created" );
  }
  else {
    return req.CreateResponse(HttpStatusCode.BadRequest,
      $"The request was incorrectly formatted." );
  }
}
public class BingeRequest{ . . . }
public class BingeDocument { . . . }

在執行中的程式碼的第一行會以非同步方式讀取要求,並將結果轉換成 BingeRequest 物件。

接下來,我具現化新 BingeDocument,傳入剛才建立要求,會導致完整擴展 BingeDocument 物件,以及擴展的記錄屬性中的物件。

然後,我使用 TraceWriter 顯示某些資料要求,從記錄檔中,因此偵錯時,可以判斷是否 BingeDocument 未確實從取得資料的要求物件。

最後,以非同步方式加入剛才建立到非同步 outputDocument BingeDocument。

該 outputDocument 物件的結果會傳給 Cosmos DB 函式。它會儲存成 json DocumentDB — 函式中將它轉換再次幕後為您。因為我有線網路的所有項目上的整合設定,我不需要撰寫任何程式碼來進行時,會發生。

當完成後時,傳回一則訊息透過 HttpResponse,轉送函式的成功或失敗。

編譯和測試函式

儲存圖片時,會編譯函式。我要隨機刪除重要程式碼中的項目,因此您可以看到在動作中,編譯器以程式碼視窗下方的 [記錄] 視窗中顯示的結果。圖 6顯示編譯器的輸出,反白顯示我建立從列 13 刪除左大括號的混亂。即使沒有偵錯工具中,我發現,查看這些錯誤協助我逐步執行我有撰寫沒有的 IntelliSense 或其他程式碼撰寫工具協助我 Ide 中的程式碼。同時,我已了解我相依於這些工具的多少 !

顯示編譯器資訊包括錯誤的記錄視窗
圖 6 顯示編譯器資訊包括錯誤的記錄視窗

記錄檔時修正程式碼,而且編譯器高興,會顯示"Reloading 」 訊息後面接著 「 編譯成功。 」

現在就可以測試的功能,您可以在相同的視窗,其中您的撰寫語言函數該權限。右邊的程式碼編輯器中兩個索引標籤式的窗格。一個顯示函式相關的檔案的清單。根據預設,有只有兩個,目前我要在 run.csx 檔案和 function.json 檔案,其中包含所有 UI 中定義的設定。  [其他] 索引標籤可用來執行測試。此內建測試 UI 是類似的迷你郵差或 Fiddler 應用程式的 HTTP 要求建立許多較輕鬆,因為它已經知道要測試的函式。您只需要為插入來表示內送要求的 JSON 物件。測試 UI 預設值來傳送 HTTP Post,因此即使您不是需要變更,這項測試。文字方塊中輸入下列 JSON 要求主體。結構描述很重要,但您可以使用任何您想要的值:

{
  "userId": "54321",
  "userName": "Julie",
  "deviceName" : "XBox",
  "dateTime": "2017-10-25 15:26:00",
  "score" : "5",
  "worthit" : "true",
  "logged": ""
}

接下來,按一下 [測試] 窗格的 [執行] 按鈕。測試會呼叫函式,在要求主體中,傳遞,然後在 [輸出] 視窗中顯示的任何 HTTP 結果。在圖 7,您可以看到輸出 「 54321 已建立,」 以及從 [記錄] 視窗中的函式的記錄檔輸出。

此函式上執行測試之後的 [測試] 窗格
圖 7 之後執行測試的函式上的 [測試] 窗格

Cosmos DB 資料庫中檢視新的資料

您無法在此看到的是,此第一個成功的測試,因為 CookieBinge Cosmos DB 所建立的資料庫,然後在其中儲存這份文件 Binge 集合。讓我們看看它之前完成這一期的我的多重部分資料行。

您可以先開啟 Cosmos DB 帳戶入口網站建立此資料庫的位置中。我是在呼叫 datapointscosmosdb,所以我會前往來尋找篩選器中的所有資源和類型的資料。一旦開啟帳戶,可以看到所有的集合和資料庫,我必須只有一個 CookieBinge 資料庫中,我 Binges 集合中所示,雖然圖 8。這是什麼剛收到建立函式。

Binges 集合中所列 datapointscosmosdb 帳戶
圖 8 Binges 集合中所列 datapointscosmosdb 帳戶

按一下以開啟該集合資料總管 Binges。我已執行測試兩次,因此您可以看到在圖 9兩份文件儲存在集合中。文件中的前七個屬性所定義的屬性。其餘的 Cosmos DB 和相關的應用程式開發介面使用的工作,例如索引、 搜尋、 分割等等的中繼資料。

查看 Cosmos DB 在入口網站中儲存的文件
圖 9 查看 Cosmos DB 在入口網站中儲存的文件

展望未來

如果您回頭看圖 7,您會看到上述程式碼視窗中取得函式 URL 連結。該 URL 是什麼我將使用 CookieBinge 應用程式中將資料傳送至雲端。

既然您已經看到如何建立此函數,並將它連結以 DB Cosmos,我下一欄會顯示如何建立兩個的多個函式來擷取資料的不同檢視。最後一篇會顯示如何從 CookieBinge 應用程式呼叫的函式,並顯示其結果。


Julie LermanMicrosoft 地區主管、 Microsoft MVP、 軟體小組指導,以及位於 Vermont 山區顧問。您可以找到其呈現在資料存取和使用者群組和所做的心得世界各地的其他主題。在她部落格thedatafarm.com/blog和以及 Code First DbContext 版本中的,所有從 O'Reilly Media 是"程式設計 Entity Framework"的作者。在 Twitter 上關注她: @julielerman ,請參閱在她 Pluralsight 課程juliel.me/PS 影片

非常感謝下列 Microsoft 技術專家檢閱這篇文章:Jeff Hollan


MSDN Magazine 論壇中的這篇文章的討論