2018 年 2 月

第 33 卷,第 2 期

本文章是由機器翻譯。

資料點 - 建立幾乎不使用程式碼即可從 Cosmos DB 讀取的 Azure 函式

Julie Lerman

Julie Lerman在第一個資料行,我向您說明如何使用 Entity Framework Core 2 (EF 核心 2) 在 Windows 10 裝置上本機儲存的遊戲的分數,遊戲正在播放。在第二個資料行,我帶您完成建立 Azure 函式會接受透過 HTTP 傳送遊戲的分數,並將它們儲存到 Cosmos DB 資料庫。最終的目標是修改能夠將其分數傳送到此函式,以及從平行函式擷取分數資料遊戲。

在此資料行,我將為您示範如何建立 Azure 函式會回應要求,以擷取兩組計分資料: 前五個分數一位使用者的所有使用者的裝置,以及五個高分的所有使用者播放 CookieBinge 遊戲周圍世界。下一次,在數列中最後一個資料行,我將會整合新的 Azure 功能 CookieBinge UWP 應用程式,可讓使用者共用,並比較其分數。

前一個發行項中所建立的 Azure 函式會回應 HTTP 呼叫,並使用函式的整合是能夠將資料從 HTTP 要求推送至 Cosmos DB 資料庫,而不需要撰寫任何的資料存取程式碼我。圖 1 Binges CookieBinge 資料庫集合中儲存的文件的其中一個顯示。第一次七項屬性我的儲存 (「 記錄 」 透過 「 worthit"),而其餘 Cosmos DB 時插入記錄建立的中繼資料。

記錄從 CookieBinge Binges 集合
圖 1 記錄從 CookieBinge Binges 集合

下面兩個函式中,我將會再次利用 Azure 函式與相同的 Cosmos DB 資料庫互動的整合。唯一的程式碼所需的資料庫互動功能,這次會表示必要的查詢字串中,某些 SQL 和這取得內建整合,而不是函式的程式碼。這兩個函數將會觸發 HTTP 呼叫。第一個會接受使用者提出要求的識別碼,而且然後傳回前五個分數登跨所有裝置,他們便播放遊戲的使用者。第二個不會發生任何輸入。它只會傳回所有玩家正面對決從世界各地的五個高分。

我將引導您完成建立加入至前一個資料行的課程使用 Azure 入口網站工作流程,這些函式的第一個。逐步解說的第一個這些函式,應可協助您了解如何所有拼圖互相配合。我將然後為您示範捷徑時建立第二個階段。請記住,也可以建置到 Visual Studio 2017,以及使用函式命令列介面 (CLI) 的工具,以建立 Azure 函式,再加上 Visual Studio 程式碼。

建立一個函數來傳回使用者的最高得分

我們現在返回 CookieBinge Azure 函式中的應用程式在 Azure 入口網站,並將新的函式加入至應用程式。請注意當您將滑鼠停留在功能群組標頭,函式應用程式的名稱下,您會看到您可以按一下加號。當您這樣做時,將提示您選擇新的函式的範本,然後做為與您所建立的第一個函式會在 C# HTTP 觸發程序。命名新的函式 GetUserScores,請將授權層級變更為匿名,然後按一下 [建立]。

在修改之前 run.csx 檔案中的程式碼,我將建置函式的整合。前文提過,有三種類型的整合:

  • 觸發程序:只能有單一觸發程序,在此情況下,它是函式的 HTTP 要求。
  • 輸入的整合:可能有多個輸入的整合,這些代表您要提供給函式的其他資料。
  • 輸出整合:在先前的文章中,我有線 CookieBinge Cosmos DB 資料庫,而導致要儲存於資料庫的函式的結果輸出整合。此新 GetUserScores 函式的輸出將會傳回給要求者做為 HTTP 回應的函式的結果。

我將連接從 Cosmos DB 儲存所在的資料庫 StoreScores 函式,從上個月的發行項其擷取資料的輸入整合。此輸入已為我一開始會造成混淆的概念。我假設我就得撰寫一些程式碼連接至該資料庫和使用者的分數來查詢函式中。但是很酷吧輸入的整合。我可以定義具有相關的 SQL 查詢 Cosmos DB 資料庫,並讓它知道要使用以 HTTP 要求已傳送的使用者識別碼值。和 Azure 函式會處理其餘 — 連接到資料庫、 執行查詢,並將我的工作函式程式碼中使用查詢結果。是,很棒確實 !就來看看它。

建立從 Cosmos DB 使用 HTTP 要求的資料輸入的整合讀取

開始依序按一下新輸入,在整合功能] 面板中,然後從清單中顯示的輸入類型、 選擇 Cosmos DB,然後按一下其下方的 [選取] 按鈕。這會導致 Cosmos DB 輸入表單,其欄位填入預設值。修改的值,如下所示圖 2

Azure Cosmos DB 輸入的整合設定
圖 2 Azure Cosmos DB 輸入整合設定

您用於建立 StoreScores 函式的輸出整合資料庫名稱、 集合名稱和連接應該符合 Azure Cosmos DB 帳戶的值。在這個案例中,這是 CookieBinge、 Binges 及 datapointscosmosdb_DOCUMENTDB。我已 「 文件 」,我將我的函式程式碼中使用此名稱為我的參數。文件識別碼是空白。如果您正在建置函式來擷取單一 Cosmos DB 文件識別碼,這會是很方便的選項。但此函式會根據連入的使用者識別碼的查詢。

SQL 查詢會遭裁切關閉螢幕擷取畫面,因此這裡是以完整模式。請記住您需要將它新增為單一程式行,不過這裡所列傳回用來更輕鬆地讀取:

SELECT  TOP 5 c.score,c.worthit,c.deviceName,c.dateTime
FROM c
WHERE c.userId={userId}
ORDER by c.score DESC

Azure Cosmos DB 有可讓您更妥善使用熟悉的 SQL 查詢語法。

請注意使用者識別碼的變數,{userId} 預留位置。我將使用這個變數呼叫觸發程序,這個輸入整合。首先,我需要此輸入的設定儲存。然後,我要建立繫結參數,以將觸發程序繫結至輸入。作法不是是立即明顯的方式。事實上,我收到它已正確地設定之前,我保留取得正在遺漏繫結參數的相關錯誤,而且花費某些放在一起什麼我已從學習文件、 Web 搜尋結果和某些實驗之前得到正確的投入時間。部分是問題的缺少我了解,雖然一旦我找到方案時,連線到我沒有任何意義。希望您會看到光線更快速地因為我即將 spoon-feed 給您的方案 !

選取 HTTP (要求) 觸發程序並指定觸發程序的路由範本。範本應該先提供路由的名稱,然後指定 [繫結的變數時,使用者識別碼。

路由不一定要相符名稱的函式,但可能會更清楚。名為採擷 GetUserScores / {userId},如中所示圖 3。別忘了要儲存變更。

HTTP 觸發程序整合設定
圖 3 HTTP 觸發程序整合設定

輸出整合能保持其預設值,就是 HTTP 回應。

現在它是函式程式碼,您可以按一下 GetUserScores 函式傳回的時間。這會顯示 run.csx 程式碼,仍在其預設狀態。

撰寫函式的程式碼來回應整合

請考慮為輸入,這會擷取四個資料行的整合 SQL: 分數、 worthit、 deviceName 和日期時間。您無法建立類別以符合每個輸入 (如前一篇文章的 StoreScores 函式中),或只 tell 函式的輸入函式會傳入動態類型。這是我的程式碼的用途。圖 4 run.csx 檔案中會顯示整個函式。

圖 4 GetUserScores 函式的執行的方法

using System.Net;
public static HttpResponseMessage Run(string userId,
               HttpRequestMessage req, IEnumerable<dynamic> documents, 
               TraceWriter log)
{
  if (documents != null)
  {
    log.Info($"Document Count: {documents.Count()}");
    return req.CreateResponse(HttpStatusCode.OK,documents);
  }
  else
  {
    return req.CreateResponse(HttpStatusCode.NotFound);
  }
}

在其簽章,Run 方法會認可第一個參數是字串,指定透過觸發程序設定中指定的路由傳入的使用者識別碼。使用者識別碼之後, 參數預期 HttpRequestMessage (要求),然後包含文件的 IEnumerable。在幕後,函式會採用透過觸發程序的路由來源的 userId,並將它傳遞至輸入的整合,這會執行查詢 (使用使用者識別碼),並填入文件變數,以查詢結果。在此之後,函數將最後呼叫寫好的執行方法的邏輯。

程式碼會先檢查,文件,事實上,傳遞至方法。我我這些文件計數的記錄檔輸出訊息,然後只將其傳遞 HTTP 回應中。如果我沒有進行任何檢查功能和平衡性,方法仍然運作更簡單格式如下:

public static HttpResponseMessage Run(string userId,
              HttpRequestMessage req, IEnumerable<dynamic> documents)
{
  return req.CreateResponse(documents);
}

換句話說,接收的使用者識別碼並傳回使用者的五個高分從資料庫採用只一行程式碼,此整個函式是不能超過 「 傳送回來自輸入整合文件。 」

Azure 函式的整合為我實際上完成所有工作。我是真正的印象。

在入口網站或 Fiddler 或郵差等工具中,我們可以測試此函式。從瀏覽器測試將不會使用目前的狀態中的函式,因為函式所傳回的動態物件和瀏覽器無法傳送所需的 Accept 標頭。或者,您可以定義比對查詢結果的類別,並使用該類別,而不是動態的物件。但是,所以,函式會正常運作時呼叫從 Fiddler、 郵差或您的 Api,像是您最終會的使用從 UWP 應用程式。

取得函式 URL 連結告訴我可以呼叫 https://cookiebinge.azurewebsites.net/api/GetUserScores/ {userId}。如果函式未匿名的然後我就得將某些認證中,但我刻意保持簡單這裡。

使用我的使用者識別碼預留位置中 54321,URL 看起來像這樣: https://cookiebinge.azurewebsites.net/api/GetUserScores/54321。

此 URL 與結構描述查詢所傳回五個 JSON 格式的文件。以下的其中一個傳回 HTTP 回應,顯示的玩我的 Xbox 上我 scarfed 向 18 cookie,但未樂於有關我 binge 那一天中的文件。

{
  "score": 18,
  "worthit": false,
  "deviceName": "XBox",
  "dateTime": "2017-11-05T15:26:00"
}

以建立另一個完全整合的 Azure 函式

現在有設定的第一個函式,就可以建立第二個,會在世界各地的所有播放程式擷取的前五個分數。而非一次瀏覽的所有設定表單,不過,我們即將採取快速鍵。所有 Azure 函式的整合功能的設定會都儲存在 function.json 檔案中,您可以開啟入口網站,從 [檢視檔案] 窗格中。圖 5顯示 function.json GetUserScores 函式。繫結區段可包裝所有的整合設定。

圖 5 GetUserScores function.json 檔案

{
"bindings": [
  {
    "authLevel": "anonymous",
    "name": "req",
    "type": "httpTrigger",
    "direction": "in",
    "route": "GetUserScores/{userId}"
  },
  {
    "name": "$return",
    "type": "http",
    "direction": "out"
  },
  {
    "type": "documentDB",
    "name": "documents",
    "databaseName": "CookieBinge",
    "collectionName": "Binges",
    "sqlQuery": "SELECT  TOP {top} c.score,c.worthit,c.deviceName,
      c.dateTime FROM c WHERE c.userId={userId} ORDER by c.score DESC",
    "connection": "datapointscosmosdb_DOCUMENTDB",
    "direction": "in"
  }
],
"disabled": false
}

第一個繫結是 httpTrigger,其 type 屬性中所述。請注意,其設定的其餘部分描述了所有其他屬性 authLevel、 名稱、 方向和路由。接下來,您可以看到 http 輸出繫結,以及最後,輸入繫結的所有設定] 中指定表單。

既然您已進一步了解所有函式的拼圖,實際上不需要瀏覽表單中,如果您不想要。您可以只會直接建立 function.json 檔案,且我的第二個函式。您仍需要將新的函式至函式應用程式中,因此這樣做,請再次使用 C# HttpTrigger 範本,並呼叫它 GetGlobalScores。

但這次不需要移至 [整合] 區段,檢視檔案] 窗格中,開啟 function.json 檔案,並且取代中的程式碼圖 6。請注意,sqlQuery 值都在清單中,以下包裝該字串應該可以在同一行。

圖 6 GetGlobalScores function.json 檔案

{
  "bindings": [
    {
      "authLevel": "anonymous",
      "name": "req",
      "type": "httpTrigger",
      "direction": "in"
    },
    {
      "name": "$return",
      "type": "http",
      "direction": "out"
    },
    {
      "type": "documentDB",
      "name": "documents",
      "databaseName": "CookieBinge",
      "collectionName": "Binges",
      "connection": "datapointscosmosdb_DOCUMENTDB",
      "direction": "in",
      "sqlQuery": "SELECT  TOP 5 c.userName, c.score,c.worthit,c.deviceName,
        c.dateTime FROM c ORDER by c.score DESC"
    }
  ],
  "disabled": false
}

此要求需要傳入識別碼,因為沒有任何路由的 httpTrigger 繫結做為第一個函式。輸出繫結將會是相同與之前。輸入繫結與唯一的差別是為不同的查詢不會篩選使用者識別碼。

了解及套用以其原始格式的繫結可以肯定您省大量時間。取得第一個使用表單輸入設定的明確路徑有幫助,不過,如它幫助我了解設定為我已先深入了解它們。事實上,現在,您會看到設定的儲存方式,您已充分準備建置 Azure 函式在 Visual Studio 或 Visual Studio 程式碼,而不是在入口網站。

現在的函式程式碼,這是與第一個函式中,程式碼幾乎完全相同之處在於它不接受 userId 繫結,做為其第一個參數中。以下是修改過的 Run 方法簽章:

public static HttpResponseMessage Run(
              HttpRequestMessage req, IEnumerable<dynamic> documents, TraceWriter log)

我以手動方式修改的部分測試資料以確定發生一些不同的使用者識別碼值執行來驗證新 GetGlobalUserScores 函式之前我 Cosmos DB Binges 集合中的所有項目正確運作的。

連結 UWP 應用程式與 Azure 的函式

三個 Azure 函式和 Cosmos DB 文件資料庫儲存和擷取使用者分數手中,這個序列的最後一篇會傳回 UWP 應用程式整合這些函式。前文提過,UWP 應用程式目前使用 Entity Framework Core 2 儲存在本機上任何 Windows 10 裝置的使用者分數所播放的遊戲。在下一個反覆項目,除了本機儲存體中,使用者的分數 (具有其權限) 會傳送至 StoreScores Azure 函式儲存在雲端中。使用者將無法擷取一份自己高分它們已在其上的所有裝置上播放,以及查看所有播放程式在世界各地高分。應用程式會呼叫以向使用者報告該資料在此處建立的函式。

請注意,我將可能關閉自己示範函式,在本文稍早所述的 Url。它們被裝載在 Visual Studio 訂閱我的帳戶,這是基於測試目的,且具有消費限制。


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
Jeff Hollan 是 Microsoft Azure 函式的資深程式管理員。  他加入 Microsoft 有點超過 4 年前且所耗用時間管理後端 IT 系統整合,並協助管理包括邏輯應用程式的 Azure 中的其他產品。Jeff 熱情所有事項技術,而且他在世界各地的會議的簡報。您可以在 Twitter 上關注 Jeff @jeffhollan


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